2010-08-24 69 views
2

當你的子記錄通過lambda查詢加載時,有沒有人有過使用LINQ to SQL加載關聯的問題?例如:從lambda查詢結果訪問關聯的問題

var orderLine = db.OrderLines. 
    Where(ol => ol.ID == orderLineID select ol). 
    First(); 
// navigate to order via the association 
var order = orderLine.GetOrder(); 

我得到的基本上是GetOrder()的空結果。

但如果我這樣做,而不是:

var orderLine = (from ol in db.OrderLines where ol.ID == orderLineID).First(); 
var order = orderLine.GetOrder(); 

工作正常。

這是什麼原因造成的?這是一個錯誤?

編輯:這裏是與註釋掉Lambda表達式WORKS的實際代碼不起作用

 
var msg = db.Messages.Where(m => m.ID == msgID).First(); 
if (msg.SentTS.HasValue) return; 

// Get the message recipients 
// I don't get it.. why doesn't lambda expressions work here? returns 0 results! 
// var testtos = msg.GetMessageTos.Where(mt => mt.Active); 
var tos = from mt in db.MessagesTos 
      where mt.Active && mt.MessageID == msgID 
      select mt; 

回答

0

請參閱我的編輯代碼的工作。我想有時候「答案」是做有用的事情,不一定是你理解的。

0

你也可以試試這個,我認爲這是一個小清潔。

var orderLine = db.OrderLines.Single(ol => ol.ID == orderLineID); 
var order = orderLine.GetOrder(); 

我在你不工作的例子beileive要使用.First()而不是.Single()

+0

請參閱我的編輯與實際代碼不起作用(註釋掉)。謝謝! – 2010-08-24 17:28:38

+0

「msg.GetMessageTos」和「db.MessageTos」的返回類型是什麼?另外什麼類型是'msg'和'db'?這是否工作:'var tos = db.MessagesTos.Where(mt => mt.Active && mt.MessageID == msgID).First();' – 2010-08-24 17:43:35

+0

您是否正在循環中執行此操作?如果是這樣,那麼msgID是如何設置的?您可能會遇到訪問關閉問題。 – 2010-08-24 17:44:27

0

在我看來,這個問題有更多的關聯比lambda表達式。

在您的情況,這應該工作:

var tos = db.MessagesTos.Where(mt=> mt.Active && mt.MessageID); 

雖然這不會:

var tos = from mt in msg.SentTS 
      where mt.Active 
      select mt; 

至於爲什麼它不工作,我建議採取看看協會設計人員並檢查其是否正確匹配db模型(匹配正確的列)。我還建議確認msg.SentTS實際上是空的,無論您在其上運行任何進一步的查詢。

+0

是的,它確實與db模型匹配。我也將一些代碼移動到測試頁面,並且它能夠正常工作,包括lambda查詢。所以我認爲它可能與緩存對象圖的datacontext有關,或者與使用TransactionScope有關。現在,我打算讓它獨自一人......它的工作原理。感謝您的輸入。 – 2010-09-09 12:52:43