2012-01-04 102 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); 

希望这有助于。