我的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字段?
答案 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();
fileId
和length
是传入的参数。
返回类型为IEnumerable<byte>
。