我正在构建一个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,用于表示“任何语言都可以”。
然后,我只想取前20个元素,所以我先调用Count(),然后再调用Take
然后,我根据需要对结果进行排序。
关键是,我认为lazy表达式在Count处求值-因此不能对其进行优化以仅包含SQL Query级别的前20行-而是在客户端(ASP.NET)级别。因此,我基本上将整个数据库下载到客户端,这很糟糕。
是否进行了优化(如果没有优化),即使我不得不回到普通的SQL字符串语句,也该如何以一种有效的方式进行优化?

*查询每个word

最佳答案

if(S.Count() > 20)


这会运行查询,是的...

SELECT COUNT(*) FROM


因此,您没有下载整个表格。



S = S.Take(20);


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

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



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());

关于c# - Linq-To-Sql查询优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11459015/

10-17 02:26
查看更多