我写了一个代码如下:
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;
答案 0 :(得分:1)
此外还有其他用户编写的内容。您可以禁用延迟加载。这样,如果Items Db Table具有对其他表的引用,除非您绝对需要,否则它们不会与Items一起加载。查看这些链接
还有一个人认为我建议你必须记录你的linq表达式创建的sql查询,并尝试用你的DBA优化它们。您可以通过在Action<string>
上添加DbContext.Database.Log
代理来执行此操作,该代理会在connection.Open()
和connection.Close()
之间发送所有内容。您也可以从IQueryable
或IQueryable<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();