DefaultIfEmpty в соединении LINQ-to-SQL вызывает дублирование - PullRequest
2 голосов
/ 07 июля 2011

Вот выдержка из моего запроса:

...
join p in dc.PODs on c.ID equals p.Consignment into pg
from pgg in pg.DefaultIfEmpty()
...

Что должен сделать запрос, это получить все 'POD', связанные с грузом, сохранить его как объект IEnumerable (который, кажется, работает), такЯ могу выполнить его при запросе основного IEnumerable, сгенерированного из запроса.

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

Любые идеи, ребята?

Ответы [ 2 ]

1 голос
/ 08 ноября 2012

Просто хочу подтвердить для вашего 2-го случая, разве выход не будет без двух, четырех, пяти, у которых нет ни одного элемента, поскольку это не внешнее соединение? One 1 TextBox Three 3 Refridgerator 3 Bucket

Я попытался использовать эквивалент WHERE IN для dc.PODS. ....join appraisal in ef_appraisal on application.a_appraisalid equals appraisal.a_appraisalid<br> where<br> (from r in ..<br> select r.r_applicationid).Contains(application.a_id) )

Делитесь, если у вас есть другие идеи

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

Простите, если я не согласен с вашим намерением, потому что я не вижу полной структуры ваших данных или вашего начального from или последнего select предложения в отрывке вашего запроса. Поэтому я публикую то, что я считаю решением на основе вашего фрагмента и примеров данных, которые я построил. Дайте мне знать, если я ухожу, и я исправлю это.

Если вы хотите получить список строк отправлений в POD, с каждой отправкой в ​​POD в отдельной строке, вы можете сделать что-то вроде этого (имейте в виду, что мои предложения from и select основаны на моих примерах данных ):

        // select the consignment id & name (i made up) and each matching POD
        var results = from c in consignments
                      join p in dc.PODs on c.ID equals p.Consignment into pg
                      from pgg in pg.DefaultIfEmpty()
                      select new { ID = c.ID, Name = c.Name, POD = pgg };

        // This is just a SAMPLE display just for kicks and grins
        foreach (var r in results)
        {
            Console.WriteLine(r.Name + " " + ((r.POD != null)
                                                ? (r.POD.Consignment + " " + r.POD.Description)
                                                : "none"));
        }

Этот запрос выводит что-то вроде:

One 1 TextBox
Two none
Three 3 Refridgerator
Three 3 Bucket
Four none
Five none

Однако я не совсем уверен, что понимаю ваше замечание:

"Проблема в том, что я получаю дубликаты основных строк "

Я не уверен, что если вы говорите, что не хотите видеть одну партию на покупку в строке, где каждый результат в IEnumerable представляет собой товар с партией и последовательностью POD, вы бы хочу запрос как:

        // select the Consignment ID and Name (i made up), and list of PODs
        // instead of the individual POD
        var results = from c in consignments
                      join p in dc.PODs on c.ID equals p.Consignment into pg
                      select new { ID = c.ID, Name = c.Name, PODs = pg };

        // This is just a SAMPLE display just for kicks and grins
        foreach (var r in results)
        {
            Console.WriteLine(r.Name + " ");

            if (r.PODs.Count() > 0)
            {
                foreach (var pod in r.PODs)
                {
                    Console.WriteLine("\t" + pod.Consignment + " " + pod.Description);
                }
            }
            else
            {
                Console.WriteLine("\tNone");
            }
        }

Там, где выбор выбирает список POD вместо индивидуального соответствия, который выводится следующим образом:

  One
        1 TextBox
  Two
        None
  Three
        3 Refridgerator
        3 Bucket
  Four
        None
  Five
        None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...