LINQ-Join таблицы на пустые столбцы - PullRequest
4 голосов
/ 18 апреля 2011

как присоединиться к таблицам на обнуляемых столбцах?

У меня следующий LINQ-запрос, RMA.fiCharge может быть NULL:

Dim query = From charge In Services.dsERP.ERP_Charge _
                     Join rma In Services.dsRMA.RMA _
                     On charge.idCharge Equals rma.fiCharge _
                     Where rma.IMEI = imei
               Select charge.idCharge

Я получаю «Преобразование из типа« DBNull »в тип« Integer »недопустимо» в query.ToArray():

Dim filter = _
       String.Format(Services.dsERP.ERP_Charge.idChargeColumn.ColumnName & " IN({0})", String.Join(",", query.ToArray))

Так что я могу добавить WHERE RMA.fiCharge IS NOT NULL в запросе. Но как это сделать в LINQ или есть другой вариант?

Заранее спасибо.


Решение:

Проблема заключалась в том, что DataSet не поддерживает Nullable-Types, но генерирует InvalidCastException, если вы запрашиваете какие-либо NULL-значения в целочисленном столбце (спасибо Martinho). Модифицированный LINQ-запрос от dahlbyk работает с небольшими изменениями. DataSet генерирует логическое свойство для каждого столбца с AllowDbNull = True, в данном случае IsfiChargeNull.

Dim query = From charge In Services.dsERP.ERP_Charge _
            Join rma In (From rma In Services.dsRMA.RMA _
                         Where Not rma.IsfiChargeNull
                         Select rma)
              On charge.idCharge Equals rma.fiCharge _
            Where rma.IMEI = imei
            Select charge.idCharge

Ответы [ 2 ]

3 голосов
/ 18 апреля 2011

Вы пытались добавить нулевую проверку в ваше предложение where?

Dim query = From charge In Services.dsERP.ERP_Charge _
            Join rma In Services.dsRMA.RMA _
              On charge.idCharge Equals rma.fiCharge _
            Where rma.fiCharge <> Nothing AndAlso rma.IMEI = imei
            Select charge.idCharge

Если это не сработает, вы можете попробовать что-то вроде этого:

Dim query = From charge In Services.dsERP.ERP_Charge _
            Join rma In (From rma in Services.dsRMA.RMA _
                         Where rma.fiCharge IsNot Nothing
                         Select rma)
              On charge.idCharge Equals rma.fiCharge _
            Where rma.IMEI = imei
            Select charge.idCharge
0 голосов
/ 19 октября 2011

Несмотря на то, что вы можете использовать LINQ to Datasets для решения этой проблемы, вы можете найти более высокую производительность, используя предопределенные DataRelations вместо специальных объединений. См. http://msdn.microsoft.com/en-us/library/dbwcse3d.aspx для получения информации об отношениях данных.

Если вы используете LINQ to Datasets, вы можете проверить нашу бесплатную бонусную главу 14 о них по адресу http://www.manning.com/marguerie/.

...