[c#]Linq 到实体。Take() 对 VARBINARY 场结果在 ArgumentException ' DbLimitExpression 需要一个集合参数

发布时间: 2017/2/28 21:37:00
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一张桌子在我 SQL Server 数据库,其中存储文件内容。我使用 Linq 到实体来访问数据,但我不想要抓住整个文件的内容,只是第一次的 2048 个字节。(以节省时间、 带宽、 存储、......)

实体称为 '文件访问' 与 'FileAccessId INT',而' FileContent varbinary (max) 的相关字段。

我试过以下 Linq:

IQueryable<IEnumerable<byte>> q = from fa in FileAccesses
                                  where fa.FileAccessId == 77868
                                  select fa.FileContent.Take(2048);

IEnumerable<byte> buffer = q.FirstOrDefault();

return buffer;

ArgumentException,DbLimitExpression 需要一个集合参数。参数名︰ 参数。

有什么办法,使这项工作吗?或更好的方式,只有抓住 VARBINARY 战场的一部分吗?

解决方法 1:

它看起来不像 EF 支持此功能。

我结束了创建用户定义的标量函数,如下所示︰

IF OBJECT_ID('dbo.SubBinary','FN') IS NOT NULL
    DROP FUNCTION dbo.SubBinary;
GO

CREATE FUNCTION SubBinary(@contents VARBINARY(MAX), @start INT, @length INT)
RETURNS VARBINARY(MAX)
AS
BEGIN
    RETURN SUBSTRING(@contents, @start, @length);
END
GO

并将它添加到我上下文MSDN 中所述

然后调用它,如下所示︰

var q = from fa in FileAccesses
        where fa.FileAccessId == fileId
        select SubBinary(fa.file_content, 1, length);

return q.FirstOrDefault();

fileIdlength 是传入的参数。 返回类型是 IEnumerable<byte>

官方微信
官方QQ群
31647020