лучший способ многократного соединения linq? - PullRequest
0 голосов
/ 21 мая 2009

Вот что я пытаюсь сделать:

У меня есть три таблицы, манифест, реквизиты и биллинг. Журнал

для каждого манифеста есть детали, и это может быть запись в billingJournal или нет, если она есть и имеет поле recordType = 1, то billingJournal.amount - это сумма для выставления счета, и она мне также нужна в моей сетке.

В настоящее время я делаю два этапа:

  1. Используя обычное объединение, чтобы собрать манифест и его детали, я возвращаю простое представление таблицы данных с прикрепленным кодом, основанным на выбранном пользователем диапазоне дат.

  2. Затем я могу пройтись по сетке данных с помощью цикла. Я установил цикл для проверки каждой строки таблицы данных, прочитал номер манифеста и затем выполнил поиск linq в таблице billingJournal. Если есть совпадение, он считывает данные из таблицы billingJournal, получает значение и сохраняет его в текущей строке сетки данных. IE после просмотра каждого манифеста в billingJournal, если есть соответствующий манифест с типом записи 1 (сумма счета), тогда я могу сделать простую замену, например:

BillingReportDataGrid ("amount", 1) .Value = queryResult

Что я хотел бы знать, есть ли способ сделать все это в моем основном запросе linq? Или есть просто лучший способ сделать это, чем то, как я это делаю?

Я использую класс reportData, чтобы получить доступ к столбцам по имени.

Я пытался поиграть с левыми соединениями, но, похоже, не совсем понял.

Спасибо -

- Джо

  Dim query = From detail In db.details _
                Where detail.InboundDate >= CType(MonthCalendar1.SelectionStart, DateTime) _
                And detail.InboundDate <= CType(MonthCalendar1.SelectionEnd, DateTime).AddHours(23).AddMinutes(59) _
                Join mainfest In db.Manifests On mainfest.ManifestID Equals detail.MainID _
                Select New reportData With {.Amount = Nothing, .ManifestID = mainfest.ManifestID, .InboundDate = detail.InboundDate}

Ответы [ 3 ]

2 голосов
/ 23 мая 2009

Вот пример того, о чем говорит Рик, имитируя внешнее объединение в LINQ. Мой VB.Net ржавый, но я знаю, что это хорошо работает в C #:)

Dim query = From detail In db.details _
                Where detail.InboundDate >= CType(MonthCalendar1.SelectionStart, DateTime) _
                And detail.InboundDate <= CType(MonthCalendar1.SelectionEnd, DateTime).AddHours(23).AddMinutes(59) _
                Join mainfest In db.Manifests On mainfest.ManifestID Equals detail.MainID into mainfestjoin _
                From submj in manifestjoin.DefaultIfEmpty()
                Select New reportData With { _
                                .Amount = Nothing, _
                                .ManifestID = If submj <> Nothing Then mainfest.ManifestID Else 0 EndIf, _
                                .InboundDate = detail.InboundDate}
1 голос
/ 22 мая 2009

То, что вы хотите, звучит как внешнее соединение с вашей таблицей billingJournal. То, что вам нужно, это оператор DefaultIfEmpty. Я не могу публиковать ссылки, но если вы ищете в Google «Имитация внешнего соединения LINQ», вы должны довольно быстро наткнуться на пример (пример hookedonlinq довольно четко изложен).

0 голосов
/ 27 мая 2009

Решение: Использование Let для присвоения переменной вместе с оператором enbeded if, кажется, делает свое дело (Спасибо Fernado из Experts Exchange за полезную информацию ....)

Dim query = From detail In db.details _
            Where detail.InboundDate >= CType(MonthCalendar1.SelectionStart, DateTime) _
            And detail.InboundDate <= CType(MonthCalendar1.SelectionEnd, DateTime).AddHours(23).AddMinutes(59) _
            Join mainfest In db.Manifests On mainfest.ManifestID Equals detail.MainID _
            Let BillingQuery = (From b In db.Billings _
                                Where b.ManifestID = mainfest.ManifestID _
                                Order By b.RecordCreationDate Descending _
                                Select b).First.Amount _
            Let BillingAmount = If(BillingQuery IsNot Nothing, Convert.ToDecimal(BillingQuery), Convert.ToDecimal(0.0)) _
            Select New reportData With {.olderDataExists = Nothing, _
                                        .Amount = Convert.ToDecimal(BillingAmount), _
                                        .ManifestID = mainfest.ManifestID, _
                                        .InboundDate = detail.InboundDate}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...