2

我想将两个 LINQ 查询结果合二为一:

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”的匿名类型,在第二个查询中,您使用属性“key, Cnt, Min, max”。这将导致两种不同的匿名类型,因为“Key”不等于“key”,“max”不等于“Max”。而且您不能将联合与两种不同的类型一起使用。

将您的第二个查询更改为:

                                  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);

以上工作,并符合您在代码中显示的模式。

所以问题出在你没有展示的地方之一。关键怀疑是元素类型query1query2不匹配。

两者的匿名对象是否具有相同的字段类型、相同的名称、相同的顺序?他们没有那将是我要寻找的第一件事。

编辑:

是的,在您编辑的问题中,query1 中的类型有一个名为Maxquery2的字段maxKey其中 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)
于 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 回答