【问题标题】:LINQ equivalent for SQLSQL 的 LINQ 等效项
【发布时间】:2012-01-04 12:59:08
【问题描述】:

我正在尝试将 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.NET Entity Framework的对象System.Data.Objects.ObjectSet

【问题讨论】:

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


    【解决方案1】:
    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();
      

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

      【讨论】:

      • 在此看不到 InnerJoin 链接。
      • 它为你做了一个连接 - 尝试在 LINQPad 中查看生成的 SQL。在 L2E 中指定连接通常是一种代码异味。
      【解决方案3】:

      这应该对您有所帮助。我想主要的问题是 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 可枚举集合。

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

      【讨论】:

      • 除了其他查询之外,这是最优雅的设计。
      【解决方案4】:

      应该是这样的:

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

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2012-08-23
        • 2011-01-08
        • 2011-01-10
        • 1970-01-01
        • 2014-06-07
        • 2011-09-29
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        相关资源
        最近更新 更多