2012-01-04 169 views
0

我想將一個ASP.NET項目轉換爲實體框架。如何重新將以下查詢寫入其LINQ等效項?對於SQL的LINQ等效

SELECT {Table1 objects} 
FROM [Table1] tb1 
INNER JOIN [Table2] tb2 
ON tb1.Table1ID = tb2.fk_Table1ID 
WHERE tb2.fk_attrib1 = '123' AND tb2.fk_attrb2 = '345' 
ORDER BY tb1.attrib1 

結果是Table1對象的集合。 這裏的Table1Table2對應於ADO.NET實體框架的對象System.Data.Objects.ObjectSet

回答

2
var results = from tb1 in Context.Table1 
       join tb2 in Context.Table2 on tb1.Table1ID == tb2.fk_Table1ID 
       where tb2.fk_attrib1 == "123" && tb2.fk_attrb2 == "345" 
       orderby tb1.attrib1 
       select tb1; 
2

事情是這樣的:

context.Table1 
    .Where(o => o.Table2s.Any(o2 => 
     o2.fk_attrib1 == '123' && 
     o2.fk_attrib2 == '345')) 
    .OrderBy(o => o.attrib1) 
    .ToList(); 

BTW,LINQPad是偉大的嘗試L2E查詢。

+0

在此看不到InnerJoin鏈接。 – Tigran 2012-01-04 13:10:43

+1

它爲你做了一個連接 - 嘗試在LINQPad中查看生成的SQL。在L2E中指定連接通常是一種代碼異味。 – 2012-01-04 13:44:22

1

這應該對你有所幫助。我想主要的問題是JOIN條款 - 在EF你可以使用NavigationProperties,不需要擔心連接表 - EF將爲你照顧。

此外,您正在嘗試從連接表過濾列。這可以使用Any方法來查找連接到Table2的所有Table1元素,其中那些引用的元素具有某些屬性/列。您還應該熟悉All方法,因爲它將來可能對您有用。

from t1 in context.Table1 
where t1.Table2s.Any(t2.fk_attrib1 == "123" && t2 => t2.fk_attrb2 == "345") 
order by t1.attrib1 
select t1; 

編輯:
我假設有Table1Table2導致枚舉集合如NavigationPropertyTable1對象之間的關係1:n

EDIT2:
在代碼中修復的錯誤 - 沒有注意到,這兩個屬性是從Table2Table1

+0

除了其他查詢做這項工作,這是最優雅的設計。 – ivowiblo 2012-01-04 13:34:51

0

應該是這樣的:

var result = (from tb1 in Table1 
       from tb2 in Table2 
         where tb1.Key == tb2.Key && 
           tb2.fk_attrib1 = '123' && 
            tb2.fk_attrb2 = '345' 
      select ione).OrderBy(p=>p.attrib1); 

希望這有助於。