繁体   English   中英

Linq-To-Sql优化查询

[英]Linq-To-Sql optimization for queries


我正在构建一个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());
    }


正如你在这里看到的那样,我有'神奇的数字' 666 ,用来说“whatevery language is ok”。
然后,我想只采取前20个元素,所以我调用Count()然后Take
然后,我根据我的需要对结果进行排序。
关键是,我认为 lazy表达式在Count处被评估 - 因此它不能被优化为包含SQL Query级别的前20行 - 而是在客户端(ASP.NET)级别。 因此,我基本上将整个数据库下载到客户端,这很糟糕。

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

*每个word的查询

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

if(S.Count() > 20)             
    S = S.Take(20); 

S = S.Take(20); 

它可以像这样重写:

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());
}
if(S.Count() > 20) 

这运行一个查询,是的...

SELECT COUNT(*) FROM

所以你没有下载整个表格。


S = S.Take(20);

这不会执行查询。 它确实将(无序)查询限制为20个项目。 通常,您希望在限制结果之前应用订单。

如果你拿的比那里多,也不例外。 你只会得到更少的物品。 因此,不需要Count。


S.ToList();

这会运行一个查询。


IQueryable<Upload> query = db.Uploads;
if (number != 666)
{
   var niqquh = Languages[number];
   query = query.Where(w => w.Language == niqquh);
}
query = query
  .OrderBy(u => (u.Tags.Contains(word) ? 15 : 0) + (u.Name.Contains(word) ? 10 : 0) + (u.Description.Contains(word) ? 5 : 0))
  .Take(20);
listOfList.Add(query.ToList()); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM