如何在LINQ中加快查询二进制搜索

时间:2014-02-23 07:29:47

标签: c# asp.net sql linq

我使用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米。这对我的客户来说太长了。

如何提高查询速度?

2 个答案:

答案 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的方式只是多余和限制。糟糕的设计。