【问题标题】:C# Lambda Join Retrieve First Row ValuesC# Lambda Join 检索第一行值
【发布时间】:2017-06-02 12:11:54
【问题描述】:

我有两个表,Table1 和 Table2。表 1 与表 2 具有一对多的关系。
Table1 有 ListId、ListName
Table2 有 FirstName、LastName、Phone、ListId、CustomField1、CustomField2

我要检索的是 Table1 中的所有行,但只检索 Table2 的第一行的 CustomField2 值。

我在下面的现有查询正在从 Table2 中检索我不想要的所有行。

 var result = _db.Lists
                .Join(_db.ListUsers, c => c.ListID, d => d.ListID, (c, d) => new { c, d });

我的最终结果集需要如下所示
Table1.ListId、Table1.ListName、Table2.CustomField2
1、第一个列表,“abc”
2、第二个列表,“def”

【问题讨论】:

  • 你需要执行左连接。
  • 我想我正在为左连接苦苦挣扎......我可以使用 CTE 和左连接在 tsql 中轻松实现这一点,但在这里没有取得太大成功。

标签: c# lambda left-join


【解决方案1】:

这应该可以解决问题,只获取右表上的第一条记录:

from i in _db.Lists
let p = _db.ListUsers.Where(p2 => i.ListID == p2.ListID).FirstOrDefault()
select new
{
  ListID = i.ListID,
  ListName = i.ListName,
  CustomField2  = p.CustomField2
}

使用 lambda 表达式,它将是:

_db.Lists
.Select (
  i => 
     new  
     {
        i = i, 
        p = _db.ListUsers
           .Where (p2 => i.ListID == p2.ListID))
           .Take(1)
           .FirstOrDefault()
     })
  .Select (
  results => 
     new  
     {
        ListID= results.i.ListID,
        ListName = results.i.ListName,
        CustomField2 = results.p.CustomField2
     }

)

【讨论】:

  • 非常感谢!!它肯定导致了我正在寻找的解决方案。感谢大家如此迅速地做出贡献。
  • 好帮手:) @Nizar
【解决方案2】:

根据我的阅读,您想要实现的结果是检索结果列表,其中包含Table1 中的所有列和Table2 中的1 列(非行)

有几种方法可以做到这一点。我会使用创建一个 DTO 类来检索我的结果。在 select 中,您需要专门列出您的选择结果中的项目。 例如, 创建一个 DTO 类

public class DTOListResult
{
 public string XXX {get; set;}
 ...
}

那么在你的结果中,你可以这样写。

  var result = (from a in _db.Lists select new DTOListResult { XXX = _db.table2.ID,
xxx = a.ID,
XXX = a.XX});

【讨论】:

  • 这是最终目标,但我还没有。由于一对多的关系,我从 Table2 中获取所有行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
相关资源
最近更新 更多