我使用Linq select语句从文件夹中获取文件作为字节。从文件表中获取字节数组需要很长时间。
我正在使用此代码:
Fun<Files,bool> Filter = delegate(Files x)
{
return x.FileID == 10;
};
Files File = DAL.FilesDAL.GetFile(Filter).First();
public static List<Files> GetFile(Func<Files,bool> lambda){
return db.Where(lamnda).ToList();
}
对于1M文件大小,最多需要1米。这对我的客户来说太长了。
如何提高查询速度?
答案 0 :(得分:3)
看起来你错过了这样一个事实:使用Func<>
会使你的查询被执行为LINQ to Objects。这意味着将整个表提取到应用程序内存中,然后由应用程序执行过滤,而不是由数据库执行。要使过滤器在数据库中执行,应将其作为Expression<Func<>>
传递:
public static List<Files> GetFile(Expression<Func<Files,bool>> lambda){
return db.Where(lamnda).ToList();
}
我认为db
这里是IQueryable<Files>
。
要使用它:
Files File = DAL.FilesDAL.GetFile(x => x.Filter == 10).First();
为了使其更具描述性,您应该将方法更改为仅返回一个Files
项。方法名称是GetFile
,所以我希望它返回一个文件,而不是文件集合:
public static Files GetFile(Expression<Func<Files,bool>> lambda){
return db.FirstOrDefault(lamnda);
}
用法:
var File = DAL.FilesDAL.GetFile(x => x.Filter == 10);
或者为了增加语义,您可以将方法重构为GetFileById
并取Id
,而不是表达式:
public static Files GetFileById(int Id)
{
return db.FirstOrDefault(x => x.FileId == id);
}
使用
var File = DAL.FilesDAL.GetFileById(10);
答案 1 :(得分:0)
如何提高查询速度?
更快的服务器。更快的网络。不要获得你不需要的二进制内容。
像那样简单。你无法在LINQ级别上做任何能够神奇修复糟糕设计的东西。一般而言:
顺便说一下,这是一个错误的错误 - 你在GetFiles中返回ToList。永远不要那样做。要么让它成为可查询的,那么用户可以添加条件和顺序,分组或返回一个可枚举的(这样功能不那么强大),但ToList意味着所有进入内存 - 即使用户不想要一个列表。
而男人,交出lambdaa的方式只是多余和限制。糟糕的设计。