2012-05-31 72 views
0

我只是試圖在2個LINQ查詢,如下進行簡單的工會:LINQ聯盟錯誤 - 類型不能被推斷

var results1 = from a in dt.AsEnumerable() 
       where array1.Contains([COL_1]) 
       select new 
       { 
        a = a.Key 
       }; 


var results2 = from b in dt.AsEnumerable() 
       where array2.Contains([COL_2]) 
       select new 
       { 
        b = b.Key 
       }; 

var concatResults = results1.Union(results2); 

但我收到以下錯誤:

The type arguments for method 'System.Linq.Enumerable.Union(System.Collections.Generic.IEnumerable, System.Collections.Generic.IEnumerable)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

任何人都可以指導我如何解決這個問題嗎?

在此先感謝

CM

回答

2

您正在試圖聯合兩個不同的(匿名)類型,這是不可能的。您可以創建自己的類型來存儲您的Key值,以便兩個查詢投影到相同的類型。

public class MyType 
{ 
    string Key { get; set; } 
} 

var results1 = from a in dt.AsEnumerable() 
        where array1.Contains([COL_1]) 
        select new MyType 
        { 
         Key = a.Key 
        }; 

+0

好的,謝謝你的回覆。他們爲什麼是不同類型的?查詢來自同一張桌子......不好意思問,我真的試圖在這裏過來一個無知的障礙! – CatchingMonkey

+0

這些類型是由編譯器創建的,它們的屬性類型是根據名稱中的賦值和名稱推斷的。在你的情況下,你有一個屬性的匿名類型,和一個具有b屬性。您可以使用自己的類型顯式化,也可以使兩個匿名類型使用相同的屬性名稱和類型。 – devdigital

1

對於編譯器成功地推斷聯合的結果的類型,通過查詢1和QUERY2返回的兩個匿名類型需要是相同的(事實上,編譯器生成的單一型)。

重命名匿名類型的屬性,以便兩者都使用ab,不混合。 a.Keyb.Key也需要是同一類型。

var results1 = from a in dt.AsEnumerable() 
      join arr1 in array1 on a.Field<int>("Col1") equals arr1 
      select new 
      { 
       Key = a.Field<int>("Key") 
      }; 


var results2 = from b in dt.AsEnumerable() 
      join arr1 in array1 on b.Field<int>("Col2") equals arr1 
      select new 
      { 
       Key = b.Field<int>("Key") 
      }; 

var unioned = results1.Union(results2);