2015-11-30 2 views
1

У меня есть пять данных в одном наборе данных. Теперь мне нужно объединить их всех. Дело в том, что некоторые записи из таблицы1 не имеют записи в других таблицах. Поэтому мне нужно левое соединение или левое внешнее соединение. В SQL он работает следующим образом:Присоединение нескольких Datatables в LINQ с использованием Group Join

SELECT * 
FROM TABLE1 LDC 
LEFT JOIN TABLE2 LGDE ON LDC.KEY1 = LGDE.KEY2 
LEFT JOIN TABLE3 DEFI ON LGDE.KEY3 = DEFI.KEY 4 
LEFT JOIN TABLE4 SETT ON DEFI.KEY5 = SETT.KEY6 
LEFT JOIN TABLE5 LST ON SETT.KEY7 = LST.KEY8 

Теперь я перестроил этот оператор с LINQ в коде VB.NET. В некоторых других сообщениях я выяснил, что мне нужно использовать DefaultIfEmpty(). Но я не мог заставить это работать. Итак, вот мой Кодекс. (Мы на .NET Framework 3.5)

Dim result = From ldc In TABLE1 
       Group Join lgde1 In TABLE2 On ldc.Field(Of String)("KEY1") Equals lgde1.Field(Of String)("KEY2") Into g = Group 
      From lgde In g.DefaultIfEmpty() 
       Group Join defi1 In TABLE3 On lgde.Field(Of Decimal?)("KEY3") Equals defi1.Field(Of Decimal?)("KEY4") Into g2 = Group 
      From defi In g2.DefaultIfEmpty() 
       Group Join sett1 In TABLE4 On defi.Field(Of Decimal?)("KEY5") Equals sett1.Field(Of Decimal?)("KEY6") Into g3 = Group 
      From sett In g3.DefaultIfEmpty() 
       Group Join lst1 In TABLE5 On sett.Field(Of Decimal?)("KEY7") Equals lst1.Field(Of Decimal?)("KEY8") Into g4 = Group 
      From lst In g4.DefaultIfEmpty() 

(Выбрать часть работы, вот почему я не отправлял его)

Я всегда получаю следующее сообщение об ошибке:

Значение mustn 't be NULL. Parametername: row в System.Data.DataRowExensions.Field [T] (Datarow, row, String columnName) в строке 336.

Любая идея, почему она не работает?

С уважением

ответ

0

я нашел Group Join работают хуже, чем следующий синтаксис

Dim queryResult = _ 
    From t1 In Table1 
    From t2 In Table2.Where(Function(r2) r2.Id = t1.Id).DefaultIfEmpty() 
    From t3 In Table3.Where(Function(r3) r3.Id2 = t2.Id2).DefaultIfEmpty() 
    . . . . 

Но тогда, если вы не выберете t1 (мы не видим вашу select часть), вы, вероятно, необходимо предоставить что-то в DefaultIfEmpty

.DefaultIfEmpty(New MyObject() With { . . . . }) 

Потому что, если вы этого не сделаете, у вас есть эта ошибка, которую вы получаете. И это ответ , почему вы получаете эту ошибку. Вы получаете его, потому что пытаетесь использовать значение, которое не существует в результате левого соединения. Это похоже на соединение DB, когда вы проверяете, является ли значение столбца Null

+0

Вот и все! Большое спасибо :) – tobiwan

0

Похоже, вам не хватает дополнительной информации, необходимой для DefaultIfEmpty(), при использовании его для левого внешнего соединения.

См. this пример, и this дублированный вопрос.

Смежные вопросы