加速LINQ查询(从表中选择数据)

时间:2017-06-02 21:01:14

标签: c# asp.net asp.net-mvc linq c#-4.0

我写了一个代码如下:

using(var ctx = new myentitiesContext())
{
   var currentLoggedUser = ctx.Users.FirstOrDefault(x=>x.Email==User.Identity.Name);
   var items = ctx.Items.Where(x=>x.Sales>0 && x.UserId==currentLoggedUser.UserId).ToList();
}

正如您所看到的,它是从数据库中进行的简单选择。但棘手的部分是有时我可以选择大量数据(一次50-100k记录)。所以我一直在想,有什么方法可以调整LINQ,以便在数据被拉出表格时更快地执行?

我已经在FK UserId的表格中创建了索引,因此该部分已完成。

我的问题是,有没有办法通过上下文配置部分的一些调整来加速LINQ查询,或者可能通过创建编译查询,或通过其他方法?

P.S。伙计们,这样的工作会很好:

ctx.Configuration.AutoDetectChangesEnabled = false;

  // my queries...

  ctx.Configuration.AutoDetectChangesEnabled = true;

2 个答案:

答案 0 :(得分:1)

此外还有其他用户编写的内容。您可以禁用延迟加载。这样,如果Items Db Table具有对其他表的引用,除非您绝对需要,否则它们不会与Items一起加载。查看这些链接

  1. thecodegarden
  2. mehdi
  3. 还有一个人认为我建议你必须记录你的linq表达式创建的sql查询,并尝试用你的DBA优化它们。您可以通过在Action<string>上添加DbContext.Database.Log代理来执行此操作,该代理会在connection.Open()connection.Close()之间发送所有内容。您也可以从IQueryableIQueryable<T>调用.ToString()变量上的IQueryable方法中取出sql查询。

答案 1 :(得分:-2)

你应该先做出投射。例如,这个:

var items = ctx.Items.Where(x=>x.Sales>0 && x.UserId==currentLoggedUser.UserId).ToList();
如果你这样写,

会更好:

var items = ctx.Items.Where(x.UserId==currentLoggedUser.UserId).Where(x2=>x2.Sales>0 ).ToList();

如果您不需要所有对象,则必须在“Where”之前使用“Select”子句,并仅投射最小化成本所需的属性,如下所示:

ctx.Items.Select(e=>new {e.UserID,e.Sales}).Where(x.UserId==currentLoggedUser.UserId).Where(x2=>x2.Sales>0 ).ToList();