Linq中的lambda /方法语法中的左外连接[重复]

Posted

技术标签:

【中文标题】Linq中的lambda /方法语法中的左外连接[重复]【英文标题】:left outer join in lambda/method syntax in Linq [duplicate] 【发布时间】:2012-08-18 00:58:43 【问题描述】:

可能重复:How do you perform a left outer join using linq extension methods

我找不到 Linq lambda(带有扩展方法)的左外连接示例,至少,不是一个明确的示例。

假设我有下表:

Parent

    PID     // PK


Child

    CID     // PK
    PID     // FK
    Text

我想加入 Parent with Child,并且对于每个缺少的孩子,我希望 Text 的默认值为“[[Empty]]”。如何使用 linq lambda 语法做到这一点?

我目前有以下:

var source = lParent.GroupJoin(
    lChild,
    p => p.PID,
    c => c.PID,
    (p, g) =>
        new // ParentChildJoined
        
            PID = p.PID;
            // How do I add child values here?
        );

【问题讨论】:

你已经尝试过什么? “linq lambda”是什么意思? 我无法理解你在做什么! @mellamokm 哦,非常有帮助,所有这些示例都是 lambda 语法!哦,等等,不,他们不是。 -_- @SergRogovtsev 我的意思是如何使用扩展方法来做到这一点。 :P 【参考方案1】:

你已经接近了。以下将为每个孩子选择 PIDCIDText,为每个没有孩子的父母选择 PIDCID = -1Text = "[[Empty]]"

var source = lParent.GroupJoin(
    lChild,
    p => p.PID,
    c => c.PID,
    (p, g) => g
        .Select(c => new  PID = p.PID, CID = c.CID, Text = c.Text )
        .DefaultIfEmpty(new  PID = p.PID, CID = -1, Text = "[[Empty]]" ))
    .SelectMany(g => g);

【讨论】:

【参考方案2】:
from p in Parent
join c in Child on p.PID equals c.PID into g
from c in g.DefaultIfEmpty()
select new 

   p.PID,
   CID = c != null ? (int?)c.CID : null, // Could be null
   Text = c != null ? c.Text : "[[Empty]]"

使用 lambda:

class ChildResult

   public int PID  get; set; 
   public int? CID  get; set; 
   public string Text  get; set; 


lParent.SelectMany(p => p.Childs.Any() ?
  p.Childs.Select(c => new ChildResult()  PID = c.PID, CID = c.CID, Text = c.Text ) :
  new []  new ChildResult()  PID = p.PID, CID = null, Text = "[[Empty]]"   );

【讨论】:

以上是关于Linq中的lambda /方法语法中的左外连接[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 查询语法 EF Core C# 的左外连接

linq中的左外连接

LINQ查询中的左外连接[重复]

csharp LINQ中的左外连接

Linq中的左外连接

Linq to SQL 使用 Lambda 语法进行左外连接并在 2 列上连接(复合连接键)