【问题标题】:Fastest c# Linq query for drop down最快的C#Linq查询下拉
【发布时间】:2014-01-07 00:09:08
【问题描述】:

我正在寻求执行最快的下拉查询,该查询将通过互联网返回 json 来轮询数据库。代码 sn-p 是一个由 Jquery Ajax 函数调用的 c# MVC 控制器。我正在寻找是否有人有任何提高性能的想法。可能有超过 50,000 条客户记录。

这是我的 MVC 控制器,客户端上发生的每个按键都会调用它。

//Load Customers as typing
public ActionResult DropDownLoader(string SearchText, int MaxResults)
{
    NovaDB db = new NovaDB((string)Session["DbConnection"]);

    var search1 = (from c in db.Customers
                   where c.Name.StartsWith(SearchText) || c.Street.StartsWith(SearchText) && c.Fresh == false
                   select new { XID = c.ID, Line1 = c.Name, Line2 = c.Street, Line3 = c.City + ", " + c.State + "  " + c.Zip, Search = 1 });
    var search2 = (from c in db.Customers
                    where c.Name.Contains(SearchText) || c.Street.Contains(SearchText) && c.Fresh == false
                   select new { XID = c.ID, Line1 = c.Name, Line2 = c.Street, Line3 = c.City + ", " + c.State + "  " + c.Zip, Search = 2 });

    var results = search1.Union(search2).OrderBy(x => x.Search).Take(MaxResults).ToList();

    return Json(results, JsonRequestBehavior.AllowGet);
}

【问题讨论】:

  • 不要一次返回 50,000 个项目.. 无论如何,生成的 SQL 是什么样的? 【如何】SQL查询慢?数据是否适当编入索引?在两个查询的条件下折叠可能会更好(顺便说一句,Contains 是 StartsWith 的超集).. 但是 RDBMS 非常聪明。
  • 不,它不会立即返回 50,000,但会在输入前 2 个字符后开始搜索。我不知道如何找到生成的 SQL。该应用程序仍在开发中,因此尚无实际结果,只是希望生成有效的代码。我想在包含结果之前给出 StartsWith 结果,以获得更好的匹配结果。谢谢..
  • 如果使用 EF,请参阅 Profiling Database Activity in the Entity Framework。 (可能有更新/不同的方法,我只积极与 L2S 提供商合作。)

标签: asp.net-mvc performance linq drop-down-menu


【解决方案1】:

你有几个不同的选择

在控制器中缓存给定 SearchText 的结果,这样您就不必每次都查询数据库。

在用户输入最少 # 个字符之前不要开始使用 ajax 功能。

索引数据库表上的 Customer.Name 和 Customer.Street 列

评估生成的 SQL 是否可以改进。

【讨论】:

  • 您认为使用缓存并尝试根据下一个搜索字母从缓存中添加或删除结果会更快吗?我确实等待最少的字符(2)。我认为近年来指数已经失宠?我听说数据库现在更智能并且可以通过您的查询来学习?感谢您的帮助。
  • 我不会太担心管理缓存。使用缓存策略,根据使用时间长短驱逐项目。即使在 NoSQL 数据库中,索引也没有失宠。
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多