2013-10-04 29 views
2

我有一個查詢,看起來像這樣的匿名類型的連接,它的工作原理,因爲它應該:多個LINQ使用lambda語法

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{ ... })  

更新響應在下面的評論的鏈接:這個問題是有關這兩條中間線在這裏:

.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

感謝您的鏈接,@丹尼斯,但我不確定它是如何與這種情況相關的。看到我的更新 - 我是否可以忽略鏈接文章中的某些內容? – Kjartan

+0

如果你發佈一段真實的代碼而不是僞代碼,它會更好。如果'ColumnA'是'IEnumerable '(或'IQueryable '),那麼是什麼意思'ColumnA.value'? – Dennis

回答

3

解決!在其他人遇到類似問題的情況下:

我的情況的問題是,我試圖比較的列中的數據類型是不同的;一個是Short,另一個是int(即,這些是用於表示表的C#實體類中使用的類型)。在這種情況下,Linq無法決定比較哪種類型。

的解決方案是簡單地投了shortint

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 
        }