2

2 つの LINQ クエリ結果を 1 つに結合したい:

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>' には ' ' の定義が含まれておらずUnion、最適な拡張メソッド オーバーロード ' System.Linq.Queryable.Union<TSource>(System.Linq.IQueryable<TSource>, System.Collections.Generic.IEnumerable<TSource>)' に無効な引数があります

私のコードの何が問題になっていますか?

4

3 に答える 3

3

最初のクエリでは、プロパティ "Key, Cnt, Min, Max" を持つ匿名型を選択し、2 番目のクエリでは、プロパティ "key, Cnt, Min, max" を使用します。「Key」は「key」と等しくなく、「max」は「Max」と等しくないため、これにより 2 つの異なる匿名型が生成されます。また、2 つの異なる型でユニオンを使用することはできません。

2 番目のクエリを次のように変更します。

                                  select new
                                  {
                                      Key = g.Key,
                                      Cnt = g.Count(),
                                      Min = g.Min(v => v.Substring(11, 4)),
                                      Max = g.Max(v => v.Substring(11, 4))
                                  };
于 2012-09-05T09:28:47.060 に答える
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);

上記は機能し、コードで示したパターンに適合します。

したがって、問題は、表示されていないビットの1つにあります。主な容疑者は、 と の要素の型が一致query1query2ないことです。

両方の匿名オブジェクトは、同じフィールド タイプ、同じ名前、同じ順序を持っていますか? 彼らがそれを持っていないことは、私が最初に探すことです。

編集:

はい、あなたの編集された質問では、 query1 の type には query2 の と呼ばれるフィールドがあり、query2Maxにはと呼ばれるフィールドがあります。これにより、それらは異なるタイプになるため、結合できません。maxKeykey

これはうまくいきます:

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)
于 2012-09-05T09:27:28.017 に答える
-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);
于 2012-09-05T09:18:27.773 に答える