2012-09-05 80 views
3

我想兩個LINQ查詢結果合併成一個集於一體:如何結合兩種LINQ查詢結果使用C#

var query1 = from sn in code           
      group sn by sn.Substring(0, 10) into g 
      select new 
      { 
       Key = g.Key, 
       Cnt = g.Count(), 
       Min = g.Min(v => v.Substring(10, 4)), 
       Max = g.Max(v => v.Substring(10, 4)) 
      }; 
var query2 = from sn1 in codes 
      group sn1 by sn1.Substring(0, 11) into g 
      select new 
      { 
       key = g.Key, 
       Cnt = g.Count(), 
       Min = g.Min(v => v.Substring(11, 4)), 
       max = g.Max(v => v.Substring(11, 4)) 
      }; 
var query3= query1.Union(query2) 

但編譯我得到一個錯誤:

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

什麼是錯的用我的代碼?

+3

可以請你告訴QUERY1和QUERY2? –

+2

肯定有'Enumerable.Union'結合了兩個'IEnumerable ':http://msdn.microsoft.com/en-us/library/bb341731.aspx因此,我希望你可能有'typeof(query1)'是不同於'typeof(query2)',或者你沒有使用'System.Linq'。 – Richard

+0

@Raphael Althaus,我已編輯我的問題上面 – user1285783

回答

3

在您選擇的第一個查詢到一個匿名類型與性質「鍵,CNT,最小值,最大值」,在第二次使用屬性「鍵,CNT,最小,最大「。這將導致兩種不同的匿名類型,因爲「密鑰」不等於「密鑰」,「最大」不等於「最大」。你不能使用兩種不同類型的聯合。

你的第二個查詢改成這樣:

        select new 
            { 
             Key = g.Key, 
             Cnt = g.Count(), 
             Min = g.Min(v => v.Substring(11, 4)), 
             Max = g.Max(v => v.Substring(11, 4)) 
            }; 
+1

謝謝你,它的工作 – user1285783

-2

而不是使用匿名類型:new{}使用您定義

public class MyType 
{ 
    public int Key { get; set; } 
    public int Cnt { get; set; } 
    public int Min { get; set; } 
    public int Max { get; set; } 
} 

一個類型,那麼你更換2種選擇:select new MyType { key = g.key }

如果您希望將它們組合: query1.Union( QUERY2);

如果你要添加的結果,你可以做AddRange

query1.ToList().AddRange(query2); 
+1

-1:這有相當不同的語義:1.它不會刪除重複的元素,2.它強制兩個評估查詢。 – Richard

+0

此外,它可能無法工作,因爲它沒有解決OP描述的基本問題 - 即query1和query2是不同的類型,所以AddRange將失敗,或者該System.Linq沒有使用,所以'ToList'將失敗。這是不同的語法,將碰到同樣的問題。 –

+0

@理查德編輯的答案,因爲問題編輯 –

2

給出的代碼是不是哪裏出了問題。例如:

var query1 = Enumerable.Range(0, 3).Select(n => new {SomePropName = n}); 
var query2 = Enumerable.Range(2, 3).Select(n => new {SomePropName = n}); 
var query3 = query1.Union(query2); 

上述工作,並適合您在代碼中顯示的模式。

所以問題出在你沒有顯示的位之一。關鍵的疑點是query1query2的元素類型不匹配。

做這兩個匿名對象,具有相同的字段類型,具有相同的名稱,以相同的順序?他們沒有這將是我會尋找的第一件事。

編輯:

是的,在你編輯的問題,其中QUERY1類型有一個名爲Max在QUERY2有一個叫max,並Key其中QUERY2有key場。這使他們不同類型,所以他們不能結合。

這將工作:

var query1=from sn in code           
           group sn by sn.Substring(0, 10) into g 
           select new 
           { 
            Key = g.Key, 
            Cnt = g.Count(), 
            Min = g.Min(v => v.Substring(10, 4)), 
            Max = g.Max(v => v.Substring(10, 4)) 
           }; 
var query2=from sn1 in codes 
            group sn1 by sn1.Substring(0, 11) into g 
            select new 
            { 
             Key = g.Key, 
             Cnt = g.Count(), 
             Min = g.Min(v => v.Substring(11, 4)), 
             Max = g.Max(v => v.Substring(11, 4)) 
            }; 
var query3= query1.Union(query2)