【问题标题】:Get data from multiple tables to an object with LINQ join使用 LINQ 连接从多个表中获取数据到一个对象
【发布时间】:2013-09-09 15:31:26
【问题描述】:

我正在尝试使用 LINQ 从 3 个相关表中获取信息。但是当我使用 2 个连接时,结果只需要从第 2 个连接中获取的元素。这是我的代码:

var myAssList = mldb.Assigns
                .Join(mldb.Lists,
                      a => a.list_id,
                      l => l.id,
                      (a, l) => new {
                         Assign = a,
                         List = l 
                     })                
                .Where(a => a.Assign.assigned_to == "myname")
                .Join(mldb.Elements,
                      li => li.List.id,
                      e => e.parent_server_id,
                      (li, e) => new { 
                         Element = e 
                      });

var jsonSerialiser = new JavaScriptSerializer();
var listListJson = jsonSerialiser.Serialize(myAssList);

这个 Json 只返回来自 Element(e) 和 List(li) 的属性。但我也想从 Assign(a) 中获取属性。

我试图在 LINQ 中实现的 SQL 查询是:

select * from Assigns 

inner join Lists 
on Assigns.server_list_id=Lists.id

inner join Elements
on Lists.id=Elements.parent_id

where Assigns.assigned_to='myname'

那么,我怎样才能从第一个连接中获取属性(从“a”、“l”和“e”)?

【问题讨论】:

  • 是否需要使用 lambda 语法?使用连接查询语法看起来更好
  • lambda 和查询语法有什么区别?是影响性能还是可用性?我真的不知道有什么区别。我以前就是这样写的。
  • 性能是一样的,因为查询语法被编译器翻译成 lambdas。查询语法更具可读性。 Lambda 语法允许您动态构建查询 - 根据条件添加或删除过滤器或其他运算符。
  • 感谢您的回复@lazyberezovsky

标签: linq inner-join multiple-tables


【解决方案1】:

您可以从外部序列li变量访问Assign实体:

.Join(mldb.Elements,
      li => li.List.id,
      e => e.parent_server_id,
      (li, e) => new { 
         Element = e,
         Assign = li.Assign // here
      });

【讨论】:

    【解决方案2】:
    from a in mldb.Assigns
    join l in mldb.Lists on a.list_id equals l.id
    join e in mldb.Elements on l.id equals e.parent_server_id
    where a => a.Assign.assigned_to == "myname"
    select new { Assign = a, Element = e }
    

    这就是所谓的“查询语法”。它使 LINQ 表达式看起来像 SQL 查询。 最后它们被翻译成IEnumerable 扩展方法。如果你想 要连接多个表,则查询语法更具可读性。另一个有用的功能 查询语法是let 子句。借助它,您可以声明其他变量 在您的查询中。

    【讨论】:

    • 也许只是添加一些解释。想想可能不太熟悉该语言但仍希望实现相同行为的未来访问者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2023-03-07
    • 2014-12-07
    • 2010-10-24
    相关资源
    最近更新 更多