Левое внешнее соединение в синтаксисе lambda/method в Linq
Возможный дубликат:
Как вы выполняете левое внешнее соединение с использованием методов расширения linq
Я не могу найти пример левого внешнего соединения Linq lambda (с методами расширения), по крайней мере, не ясный.
Скажем, у меня есть следующая таблица:
Parent
{
PID // PK
}
Child
{
CID // PK
PID // FK
Text
}
Я хочу присоединиться к Parent with Child, и для каждого отсутствующего ребенка я хочу, чтобы значение по умолчанию для Text было "[[Empty]]". Как это сделать с помощью синтаксиса linq лямбда?
В настоящее время у меня есть следующее:
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?
});
Ответы
Ответ 1
Ты близко. Следующее выберет PID
, CID
и Text
для каждого дочернего элемента и PID
, CID = -1
и Text = "[[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]]" } } );