2013-10-03 51 views
1

我試圖讓這兩個查詢的聯盟,但不斷收到以下錯誤執行工會:在LINQ

'System.Linq.IQueryable<AnonymousType#1>' does not contain a definition for 'Union' and the best extension method overload 'System.Linq.ParallelEnumerable.Union<TSource>(System.Linq.ParallelQuery<TSource>, System.Collections.Generic.IEnumerable<TSource>)' has some invalid arguments 

的LINQ查詢是這樣的:

var g = from p in context.APP_PROD_COMP_tbl 
     where p.FAM_MFG == fam_mfg 
     group p by new 
     { 
      a_B_G = p.B_G, 
      a_MFG = p.MFG, 
      a_PRODUCT_FAM = p.PRODUCT_FAM, 
     }; 

var q = from p in context.APP_COMP_tbl 
     where p.FAM_MFG == fam_mfg 
     group p by new 
     { 

      a_B_G = p.a_B_G, 
      a_MFG = p.a_MFG, 
      a_PRODUCT_FAM = p.a_PRODUCT_FAM, 

     }; 

var data = q.Union(g); 

我已經嘗試過在查詢周圍使用IEnumerable,但它仍然無法工作。我不確定哪裏會出錯,儘管LINQ並不是我曾經接觸過的東西。

更新:

所以我已經在一個稍微不同的方向,從我剛纔貼。在做了更多的研究後,group by聲明來自舊代碼,不再需要用於預期目的。我將這些改爲select new聲明,並沒有與工會進一步的問題。

回答

0

的問題是你Anonymouse類型不匹配:

var a = Enumerable.Range(1, 10).Select(x => new {a = x}).AsQueryable(); 
var b = Enumerable.Range(1, 10).Select(x => new {b = x}).AsQueryable(); 
var c = a.Union(b); 

這不會起作用,因爲typeof運算a不一樣的typeof b

var a = Enumerable.Range(1, 10).Select(x => new {a = x}).AsQueryable(); 
var b = Enumerable.Range(1, 10).Select(x => new {a = x}).AsQueryable(); 
var c = a.Union(b); 

但是這會工作,因爲Anonymouse類型是相同的。

你可以嘗試在qg從您的收藏選擇同一類型的anonymouse。閱讀更多關於Union for IQueryable

Union on IQueryAble<TSource>()接受IQueryAble<TSource>作爲參數,因此集合必須是相同的類型。

+0

@downvoter請解釋爲什麼這是一個不好的解決方案? – wudzik

+0

我看到他的匿名對象匹配,除非類型不匹配我沒有看到你的建議。 – TombMedia

+0

@TombMedia我暗示APP_PROD_COMP_tbl!= APP_COMP_tbl所以該組的對象將不匹配,工會將無法正常工作 – wudzik

2

我認爲你的問題在這裏是類型不匹配:gIGrouping<AnonymousType#1, APP_PROD_COMP_tbl>類型和qIGrouping<AnonymousType#1, APP_COMP_tbl>類型;這就是爲什麼Union會給你帶來錯誤。

我真的不知道你正在嘗試以Union(組的密鑰或數據的羣體本身),但解決辦法是:

如果你想聯合組鍵,選擇組的鍵

var data = g.Select(x => x.Key).Union(q.Select(x => x.Key)); 

如果你想工會組本身則需要從兩個序列的每個元素投影到一個共同的類型,進行分組,然後工會團體

var g = context.APP_PROD_COMP_tbl 
    .Where(p => p.FAM_MFG == fam_mfg) 
    .Select(ToCommonType) 
    .GroupBy(p => new 
    { 
     a_B_G = p.B_G, 
     a_MFG = p.MFG, 
     a_PRODUCT_FAM = p.PRODUCT_FAM, 
    }); 

var q = context.APP_COMP_tbl 
    .Where(p => p.FAM_MFG == fam_mfg) 
    .Select(ToCommonType) 
    .GroupBy(p => new 
    { 

     a_B_G = p.a_B_G, 
     a_MFG = p.a_MFG, 
     a_PRODUCT_FAM = p.a_PRODUCT_FAM, 

    }); 

var data = g.Union(q); 

private CommonClass ToCommonType(APP_PROD_COMP_tbl item) 
{ 
    return new CommonClass 
    { 
    }; 
} 

private CommonClass ToCommonType(APP_COMP_tbl item) 
{ 
    return new CommonClass 
    { 
    }; 
} 
+0

我探討了朝這個方向前進直到我意識到該組織的聲明是不必要的。 – PhoKadat