Linq中的lambda /方法语法中的左外连接

Nom*_*cio 28 .net c# linq

可能重复:
如何使用linq扩展方法执行左外连接

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

假设我有下表:

Parent
{
    PID     // PK
}

Child
{
    CID     // PK
    PID     // FK
    Text
}
Run Code Online (Sandbox Code Playgroud)

我想加入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?
        });
Run Code Online (Sandbox Code Playgroud)

Raw*_*ing 75

你很亲密 下面将选择PID,CIDText为每一个孩子,和PID,CID = -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);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!最后一个明确的答案. (5认同)
  • 谢谢你 - 几个小时都在寻找答案. (3认同)

Ami*_*ach 7

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]]"
}
Run Code Online (Sandbox Code Playgroud)

使用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]]" } } );
Run Code Online (Sandbox Code Playgroud)

  • 这不是lambda语法. (3认同)
  • 以防万一有人构建错误 - g.DefaultIfEmpty最后需要括号.即.g.DefaultIfEmpty() (2认同)