Linq to Entities:伯爵很慢

时间:2010-11-16 20:26:04

标签: c# linq entity-framework

我需要在查询中使用parent和parent.child.count()....当我这样做时需要20秒....它不是一个庞大的数据库......任何优化的想法...

var plist = context.persons
  .Select(p => new
  {
    p.fullName,
    c.personID,
    p.Status,
    p.Birthdate,
    p.Accounts.Count
  }).ToList();

6 个答案:

答案 0 :(得分:4)

当你真正想要使用any()

时,这是一篇关于使用count()的精彩文章

http://blogs.teamb.com/craigstuntz/2010/04/21/38598/

答案 1 :(得分:2)

你需要使用.count还是可以使用.any?

http://msdn.microsoft.com/en-us/library/bb534972.aspx

答案 2 :(得分:2)

由于这是实体框架,请打开sql profiler并查看正在向数据库发送的SQL查询。听起来您可能会看到发送单个查询以获取组标识符,然后另一组查询(每个组一个)可能正在获取计数。如果发生这种情况,您必须发布linq查询给某人以解决问题。

答案 3 :(得分:2)

根据您发送的代码,看起来事情应该花费那么长时间。我有一些建议:

  1. 使用LinqPad执行此查询。它将让您看到生成的SQL。然后在SQL Server Management Studio中运行该SQL代码,并告诉它包含实际的执行计划。这将帮助您了解查询中是否存在花费大量时间的特定点。例如,如果您在Account表的PersonId引用上没有索引,则此查询将花费更长的时间。
  2. 看看你是如何使用这些数据的。你真的需要在整个系统中同时拥有所有人员,这是非常罕见的。事实上,我怀疑只是将所有这些人数据从数据库中取出可能比Count()花费的时间多得多。
    • 您是否正在显示此数据?如果是这样,那么“页面”结果不是更好,一次只能显示十个条目吗?您可以在致电.Take(int)之前使用.ToList()方法,只获取所需数量的条目。
    • 如果您为了网站指标而处理和汇总这些数据,最好设置您的查询以在评估之前返回最终结果。
  3. 如果您可以描述如何使用此数据,或提供SQL执行的屏幕截图,我们可以提供更多反馈。

答案 4 :(得分:1)

我使用GroupBy方法解决了类似的问题。

的IEnumerable> accounts = Accounts.GroupBy(x => x.personID); accounts.Count()将返回属于该人的帐户数。 accounts.Key将返回该组的personID。

答案 5 :(得分:1)

我有一个类似的问题,我尝试了这些并且效果更好:

child.count(x => x.paretnID == inputParentID) child.where(x => x.parentID == inputParentID)

我的原始代码在每次迭代时花了大约15-20秒:             返回(isEdit)? db.ChasisBuys.Single(x => x.ChasisBuyID == long.Parse(Request.QueryString [“chbid”]))。Chasises.Count(y => y.Bikes.Count> 0&& y.ColorID == buyItems [(int)index] .ColorID&& y.ChasisTypeID == buyItems [(int)index] .ChasisTypeID).ToString():“ - ”;

运行良好的新代码是:

        **return (isEdit) ? db.Chasises.Where(x => x.ChasisBuyID == long.Parse(Request.QueryString["chbid"])).Count(y => y.Bikes.Count > 0 && y.ColorID == buyItems[(int)index].ColorID && y.ChasisTypeID == buyItems[(int)index].ChasisTypeID).ToString() : "-";**

数据库在chasises中有大约1000条记录,在chasisBuys中大约有5条记录,在自行车中大约有20条记录。 我的观点是,Linq to SQL查询不会在逻辑语句中进行预先评估,例如,如果你写“return a&& b&& c;”如果语句a为false,则其他语句不会被评估,而我在linq中期待这样的事情,但事实并非如此。