相当于SQL的LINQ

本文关键字:LINQ SQL 相当于 | 更新日期: 2023-09-27 18:19:20

我正在尝试转换ASP。. NET项目到实体框架。如何将下面的查询重写为它的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的对象System.Data.Objects.ObjectSet。. NET实体框架。

相当于SQL的LINQ

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;

像这样:

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

顺便说一句,LINQPad非常适合尝试L2E查询。

这应该会对您有所帮助。我想主要问题是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之间存在1:n关系,这导致Table1对象中的NavigationProperty可枚举集合。

Edit2:
修正了代码中的错误-没有注意到这两个属性都来自Table2而不是Table1

应该是这样吗?

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);