Linq to Entities ,.Take()on VARBINARY字段导致ArgumentException'DbLimitExpression需要一个集合参数

时间:2014-12-08 19:47:34

标签: c# linq entity-framework

我的SQL Server数据库中有一个存储文件内容的表。我正在使用Linq to Entities来访问数据,但我不想获取整个文件内容,只是前2048字节。 (为节省时间,带宽,内存,......)

该实体称为“FileAccess”,相关字段为“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字段?

2 个答案:

答案 0 :(得分:1)

EF并不能很好地支持VARBINARY(或其他任何事情),但你可以通过创建一个视图来解决这个问题。

CREATE VIEW FileAccessPreview AS 
SELECT FileAccessId, SubString(FileContent, 0, 2048) as FileContentPreview
FROM FileAccess

答案 1 :(得分:0)

看起来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

并将其添加到我的上下文as described in MSDN

然后按如下方式调用它:

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

return q.FirstOrDefault();

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