Възможно дублиране:
Как изпълнявате лявата външна връзка посредством методите за разширение на linq
Не мога да намеря ляв пример за външна връзка на Linq ламбда (с методи за разширение), поне не ясна.
Да кажем, че имам следната таблица:
Parent
{
PID // PK
}
Child
{
CID // PK
PID // FK
Text
}
Искам да се присъединя към родител с дете и за всяко дете, което липсва, искам стойността по подразбиране за текста да е "[[празна]]". Как мога да направя това с 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?
});
Отговори:
70 за отговор № 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);
7 за отговор № 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]]"
}
С ламбда:
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]]" } } );