DefaultIfEmpty() в соединении LINQ to SQL вызывает дубликаты

Код:

var cons = from c in dc.Consignments
join p in dc.PODs ON c.ID equals p.Consignment into pg
from p in pg.DefaultIfEmpty()
...(other joins)...
select new {
...
PODs = pg
...
}

По сути, я хочу, чтобы для каждой партии было выбрано по одной строке, и я хочу выбрать объект "POD", который должен быть набором POD. Это работает, однако я получаю по одной строке для каждого POD, поэтому, если у меня есть 3 POD на груз, для этой партии будет возвращено 3 строки. Я неправильно выбираю POD? Если я заберу DefaultIfEmpty(), он странным образом работает нормально и не вызывает дубликатов.

1 ответ

Решение

Вы используете второй from пункт, который эффективно сглаживает вещи - но тогда вы все еще используете pg в вашем select, Точка DefaultIfEmpty() если вам нужно левое внешнее объединение, то есть, где вы ожидаете одного результата на одну действительную комбинацию.

Я подозреваю, что вы просто хотите:

var cons = from c in dc.Consignments
join p in dc.PODs ON c.ID equals p.Consignment into pg
select new {
  ...
  PODs = pg
  ...
}

или может быть

var cons = from c in dc.Consignments
join p in dc.PODs ON c.ID equals p.Consignment into pg
select new {
  ...
  PODs = pg.DefaultIfEmpty()
  ...
}

... но последний даст вам результат с одной нулевой записью в PODs когда не было никаких POD, что, вероятно, не то, что вы хотели.

Другие вопросы по тегам