LINQ相当于SQL

时间:2012-01-04 12:59:08

标签: c# linq ado.net ado.net-entity-data-model

我正在尝试将ASP.NET项目转换为Entity框架。如何将以下查询重写为其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

4 个答案:

答案 0 :(得分: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查询。

答案 1 :(得分: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 :(得分:1)

这应该对你有所帮助。我认为主要问题在于JOIN子句 - 在EF中你可以使用NavigationProperties并且不需要担心加入表格 - EF会考虑到你。

此外,您正尝试从已连接的表中过滤列。您可以使用Any方法查找连接到Table1的所有Table2元素,其中这些元素具有某些属性/列。您还应熟悉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;

编辑:
我假设1:nTable1之间存在Table2关系,导致NavigationProperty对象中的可枚举集合为Table1

EDIT2:
修复了代码中的错误 - 未注意到这两个属性均来自Table2而非Table1

答案 3 :(得分: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);

希望这有帮助。