2011-07-01 110 views
0

我在實體框架中發現「包含」的問題。讓我們假設我有兩個外鍵關係的表。未收到包含對象的數據 - 實體框架

var result = (from u in entity.Table1.Include("Table2") 
      join o in entity.Table2 on u.Column1 equals o.Column1 
      where u.Column2 == 「abc」 && u.Column3 == ‘xyz’ 
      && o.Column5 == organizationCode 
      select u).FirstOrDefault(); 

對於上述查詢,即使我在數據庫中有適當的數據,它也不會返回結果中的Table2對象數據。

我發現上述查詢的問題是,如果查詢有「包括」以及「加入」,EF不考慮「包含」表。這是我的假設。

花了一些時間後,我通過在下面寫了一個虛擬查詢來獲得數據。請參閱下面的兩個查詢。

var result = (from u in entity.Table1.Include("Table2") 
      join o in entity.Table2 on u.Column1 equals o.Column1 
      where u.Column2 == 「abc」 && u.Column3 == ‘xyz’ 
      && o.Column5 == organizationCode 
      select u).FirstOrDefault(); 


    var resultOrg = (from o in entity. Table2 
        where o.Column5 == organizationCode 
        select o).FirstOrDefault(); 

執行這兩個查詢後,我在結果變量中獲取Include(Table2)數據。在這種情況下,我正在執行一個我想避免的查詢。
請建議我在哪裏做錯了。

回答

0

如果您使用的是join,則不能使用Include。現在有辦法。此外,你正在嘗試做的是過濾包括這也是不可能的。

你可以這樣做:

但是,這將包括所有Table2實體過濾Table1實體。您不能將包含的值限制爲僅具有某些組織代碼的值。

要過濾導航屬性必須使用投影:

var result = (from u in entity.Table1 
       where u.Column2 == 「abc」 && u.Column3 == ‘xyz’ && 
        u.Table2.Any(o => o.Column5 == organizationCode) 
       select new 
        { 
         Table1 = u 
         Table2 = u.Table2.Where(o => o.Column5 == organizationCode)    
        }).FirstOrDefault(); 

您必須項目要麼匿名類型或自定義類型。

爲什麼你的第二個查詢工作的原因是爲了跟蹤性關係的自動連線,這是另一種方式如何篩選關係,但在這種情況下,這已經足夠了:

var result = (from u in entity.Table1 
       where u.Column2 == 「abc」 && u.Column3 == ‘xyz’ && 
        u.Table2.Any(o => o.Column5 == organizationCode) 
       select u).FirstOrDefault(); 


var resultOrg = (from o in entity. Table2 
       where o.Column5 == organizationCode 
       select o).FirstOrDefault();