2011-03-11 60 views
3
from d in Customers 
select d; 

此查詢每撥打一個電話號碼customerId以獲取customerId = customerId的訂單。Linq查詢使所有調用帶來外鍵的表數據

這使得通話變得緩慢而漫長,我不想要訂單數據。如何禁用?

Addtional細節:

我做的條件

if (flag) 
{ 
    return (from d in Customers 
      select d).ToList(); 
}  
else 
{ 
    return (from d in Customers 
      where d.Orders.Count > 10 
      select d).ToList(); 
} 

即使它對我想,以防止這兩種情況下的每一個客戶的所有訂單調用,如果查詢。

+2

這是不正確的陳述,因爲你不顯示真正的代碼很難告訴你實際問。你可以用真實的代碼替換它嗎? – 2011-03-11 21:39:01

+0

閱讀David B所說的話,似乎我不應該在任何情況下訪問d.Orders,因爲它會在這種情況下對每個客戶進行愚蠢的調用。我應該加入?但那麼d.Orders的用法是什麼?如果這樣做會打這麼多電話,那麼這麼蹩腳的EF:D – WhoIsNinja 2011-03-11 21:46:29

+1

您更新的查詢仍然不會顯示問題。如果'Customers'是'IQueryable ',那麼'where'將在SQL中完成。如果它是'IEnumerable ',那麼它將在內存中完成。你隱藏了控制你所問的行爲的部分,但問題在於你的代碼,而不是LINQ to Entities。 – 2011-03-11 21:47:57

回答

3

As Craig Stuntz暗示,這裏的問題是其中Customers來自哪裏,它是什麼類型。如果它是內存中的對象,則過濾將在內存中發生;如果它是一個對象查詢,它將發生在你的數據庫服務器上,這正是你想要的。我們不能看到你的代碼足夠了解不多Customers,但我會提出一個正確和錯誤的例子:

右(或多或少):

using (var context = new MyContextType()) 
{ 
    var Customers = context.Customers; 

    var query = from d in Customers 
       select d; 

    if (!flag) 
    { 
     query = from d in query 
       where d.Orders.Count > 10 
       select d; 
    } 

    return query.ToList(); 
} 

錯誤:

using (var context = new MyContextType()) 
{ 
    var Customers = context.Customers.ToList(); // ToList triggers the query 

    var query = from d in Customers 
       select d; 

    if (!flag) 
    { 
     query = from d in query 
       where d.Orders.Count > 10 
       select d; 
    } 

    return query.ToList(); 
} 

看到區別?這是context.Customers.ToList()。這將運行完整查詢並在您有機會過濾它之前將所有內容加載到內存中。確保你已經完成了查詢,包括where邏輯,然後在其上運行ToList()

@克雷格 - 希望你不要介意我選擇你的想法,並與它一起運行。如果你有一個,我會投你的答案。

+0

我編輯了你的答案,包括一點評論線。我這樣做的原因是因爲我愣了十秒才明白兩個片段之間的區別.. – 2011-03-14 14:51:46

+0

@gaearon - 明白了。我試圖在代碼之外指出,但你說得對,評論有幫助。 – 2011-03-14 14:56:58

1

您發佈的查詢不會這樣做。訪問客戶實例的訂單屬性可以做到這一點。不要訪問訂單屬性,你會沒事的。

如果你的代碼沒有訪問Orders屬性,可能有些序列化代碼是......以防止代碼能夠檢索數據 - 處理數據上下文。要防止該代碼擁有訪問權限,請刪除dbml中的關聯。

+0

請查看我已添加的其他詳細信息。 – WhoIsNinja 2011-03-11 21:43:46

+1

在L2E查詢中訪問導航屬性不會導致n + 1個查詢。 – 2011-03-11 21:50:41

0

我去了dataModel,並從Customers表中刪除了屬性Orders。現在它工作正常,只有一個電話。但我不能再做e.Orders.Count了,但我寧願使用連接而不是這樣來解決這個問題。

+0

或者我可以改用視圖。 – WhoIsNinja 2011-03-14 14:12:47