我需要在查询中使用parent和parent.child.count()....当我这样做时需要20秒....它不是一个庞大的数据库......任何优化的想法...
var plist = context.persons
.Select(p => new
{
p.fullName,
c.personID,
p.Status,
p.Birthdate,
p.Accounts.Count
}).ToList();
答案 0 :(得分:4)
当你真正想要使用any()
时,这是一篇关于使用count()的精彩文章答案 1 :(得分:2)
你需要使用.count还是可以使用.any?
答案 2 :(得分:2)
由于这是实体框架,请打开sql profiler并查看正在向数据库发送的SQL查询。听起来您可能会看到发送单个查询以获取组标识符,然后另一组查询(每个组一个)可能正在获取计数。如果发生这种情况,您必须发布linq查询给某人以解决问题。
答案 3 :(得分:2)
根据您发送的代码,看起来事情应该花费那么长时间。我有一些建议:
Count()
花费的时间多得多。
.Take(int)
之前使用.ToList()
方法,只获取所需数量的条目。如果您可以描述如何使用此数据,或提供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中期待这样的事情,但事实并非如此。