2013-10-04 3 views
2

У меня есть запрос, который выглядит примерно так, что работает, как должно:множественным LINQ соединяется с анонимными типами с помощью лямбда-синтаксис

ColumnA 
    .Join(ColumnB, 
     ColumnA => ColumnA.value, 
     ColumnB => ColumnB.value, 
     (ColumnA, ColumnB) => new {ColumnA, ColumnB}) 
    .Join(ColumnC, 
     join1 => join1.ColumnA.value, 
     ColumnC => ColumnC.value, 
     (join1, ColumnC) => new {join1, ColumnC}) 
    .Join(ColumnD, 
     join2 => join2.ColumnC.Value, 
     kobling => ColumnD.Value, 
     (join2, jk1Kobling) => new{ ... })  

Теперь мне нужно добавить дополнительный столбец к второму присоединиться, и я попробовал то, что показано ниже. На данный момент я еще не добавил новый столбец для соединения, но я планировал (/* new col */ в коде). Проблема в том, что Linq, по-видимому, сейчас не в состоянии выводить типы. Почему это происходит, и есть ли какой-либо простой способ избежать этой проблемы, не создавая определенный тип только ради соединения?

Ошибка:

The type arguments for method 
'System.Linq.Queryable.Join<TOuter,TInner,TKey,TResult>(...) cannot 
be inferred from the usage. Try specifying the type arguments explicitly. 

код Я пытаюсь запустить:

ColumnA 
    .Join(ColumnB, 
     ColumnA => ColumnA.value, 
     ColumnB => ColumnB.value, 
     (ColumnA, ColumnB) => new {ColumnA, ColumnB}) 
    .Join(ColumnC, 
     join1 => new {join1.ColumnA.value, /* new col */ }, 
     ColumnC => new {ColumnC.value, /* new col*/ }, 
     (join1, ColumnC) => new {join1, ColumnC}) 
    .Join(ColumnD, 
     join2 => join2.ColumnC.Value, 
     kobling => ColumnD.Value, 
     (join2, jk1Kobling) => new{ ... })  

Update в ответ на ссылку в комментарии ниже: Проблема связана с две средние линии:

.Join(ColumnC, 
     join1 => new { join1.ColumnA.value }, 
     ColumnC => new { ColumnC.value }, 
     (join1, ColumnC) => new {join1, ColumnC}) 

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

  join1 => new { join1.ColumnA.value }, 
     ColumnC => new { value = ColumnC.value } 

     join1 => new { value = join1.ColumnA.value }, 
     ColumnC => new { value = ColumnC.value } 

Я до сих пор не могу понять, как определить, что сравнивать. Любая помощь будет принята с благодарностью.

+0

http://stackoverflow.com/a/19135333/580053? – Dennis

+0

Спасибо за ссылку, @Dennis, но я точно не знаю, как это относится к этой ситуации. См. Мое обновление. Возможно, я пропустил что-то в вашем связанном сообщении? – Kjartan

+0

Будет лучше, если вы разместите кусок своего реального кода вместо псевдокода. Если 'ColumnA' является' IEnumerable '(или' IQueryable '), то что означает' ColumnA.value'? – Dennis

ответ

3

Решенный! В случае, если кто-то еще сталкивается с подобными проблемами:

Проблема в моем случае заключалась в том, что типы данных в столбцах, которые я пытался сравнить, были разными; один был типа Short, а другой был int (то есть это типы, используемые в классах сущностей C#, которые представляют таблицы). В этом случае Linq не мог решить, какой тип использовать при сравнении.

Решение было просто забрасывать short значение int:

join1 => new { value = (int) join1.ColumnA.value }, 
    ColumnC => new { value = ColumnC.value } 

С добавлен новый столбец, решение выглядит следующим образом:

join1 => new { 
        value = (int) join1.ColumnA.value, 
        otherValue = join1.other 
       }, 
    ColumnC => new { 
        value = ColumnC.value, 
        otherValue = ColumnC.other 
        } 
Смежные вопросы