簡體   English   中英

Linq to Entities:伯爵很慢

[英]Linq to Entities : Count is very slow

我需要在查詢中使用parent和parent.child.count()....當我這樣做時需要20秒....它不是一個龐大的數據庫...任何優化的想法......

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

這篇文章是關於在你真正想要使用any()時使用count()的好文章

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

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

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

由於這是實體框架,請打開sql profiler並查看正在向數據庫發送的SQL查詢。 聽起來您可能會看到發送單個查詢以獲取組標識符,然后另一組查詢(每個組一個)可能正在獲取計數。 如果發生這種情況,您必須發布linq查詢給某人以解決問題。

根據您發送的代碼,看起來事情應該花費那么長時間。 我有一些建議:

  1. 使用LinqPad執行此查詢。 它將讓您看到生成的SQL。 然后在SQL Server Management Studio中運行該SQL代碼,並告訴它包含實際的執行計划。 這將幫助您了解查詢中是否存在花費大量時間的特定點。 例如,如果您在Account表的PersonId引用上沒有索引,則此查詢將花費更長的時間。
  2. 看看你如何使用這些數據。 您真的需要同時將整個系統中的所有人都放在內存中,這是非常罕見的。 事實上,我懷疑只是將所有這些人員數據從數據庫中取出可能比Count()花費的時間多得多。
    • 你在顯示這些數據嗎? 如果是這樣,那么“頁面”結果不是更好,一次只能顯示十個條目嗎? 您可以在調用.ToList()之前使用.ToList() .Take(int)方法,以獲得所需數量的條目。
    • 如果您為了站點指標而處理和聚合此數據,則最好設置查詢以在評估之前返回最終結果。

如果您可以描述如何使用此數據,或提供SQL執行的屏幕截圖,我們可以提供更多反饋。

我有一個類似的問題,我嘗試了這些並且更好地解決了:

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

我的原始代碼在每次迭代時花了大約15-20秒: return(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中期待這樣的事情,但事實並非如此。

我使用GroupBy方法解決了類似的問題。

IEnumerable> accounts = Accounts.GroupBy(x => x.personID); accounts.Count()將返回屬於該人的帳戶數。 accounts.Key將返回組的personID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM