DefaultIfEmpty () в соединении LINQ to SQL вызывает дубликаты - PullRequest
3 голосов
/ 08 июля 2011

Код:

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 Ответ

4 голосов
/ 08 июля 2011

Вы используете второе предложение 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, что, вероятно, не то, что вы искали.

...