Linq-To-Sql优化查询

Mar*_*gal 2 c# performance linq-to-sql


我正在构建一个Web应用程序,在其SQL数据库中搜索用户输入的查询.一个简单的搜索引擎.
让我们建议我有很多行 - 超过几万行.我想让通话变得高效.
我知道只有一个*SQL查询我的呼叫是可能的.我想知道是否进行了Linq-To-Sql这种类型的优化.
我知道它Lazy用于查询.我现在无法对它进行基准测试,因为我的数据库中没有数据.

    foreach(var word in words)
    {
        var niqquh = number == 666 ? "" : Languages[number];
        var S = db.Uploads.Where(w => number == 666 ? true : (w.Language == niqquh));
        if(S.Count() > 20)
            S = S.Take(20);
        S = S.OrderBy(u => (u.Tags.Contains(word) ? 15 : 0) + (u.Name.Contains(word) ? 10 : 0) + (u.Description.Contains(word) ? 5 : 0));
        listOfList.Add(S.ToList());
    }
Run Code Online (Sandbox Code Playgroud)


正如你在这里看到的那样,我有一个"神奇的数字" 666,用来说"语言还可以".
然后,我想只采取前20个元素,所以我打电话Count()然后Take.
然后,我根据我的需要对结果进行排序.
问题的关键是,我认为,该lazy表达式被评估处Count-因此它不能被优化包含在排名前20位行SQL Query级-但客户端的(ASP.NET)水平.因此,我基本上将整个数据库下载到客户端,这很糟糕.

它是否得到优化,如果没有,我怎么能以有效的方式做到这一点,即使我必须回到普通的SQL字符串语句?

*每个查询word

Red*_*ter 5

你是对的,它需要执行语句才能获得计数.但是,您无需检查计数.所以,改变

if(S.Count() > 20)             
    S = S.Take(20); 
Run Code Online (Sandbox Code Playgroud)

S = S.Take(20); 
Run Code Online (Sandbox Code Playgroud)

它可以像这样重写:

foreach(var word in words)
{
    var niqquh = number == 666 ? "" : Languages[number];
    var S = db.Uploads.Where(w => number == 666 || w.Language == niqquh)
        .Take(20)
        .OrderBy(u => (u.Tags.Contains(word) ? 15 : 0) + (u.Name.Contains(word) ? 10 : 0) + (u.Description.Contains(word) ? 5 : 0));
    listOfList.Add(S.ToList());
}
Run Code Online (Sandbox Code Playgroud)