1

我正在尝试合并这两个查询,但不断收到以下错误:

'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声明,并且与工会没有进一步的问题。

4

2 回答 2

2

我认为您的问题是类型不匹配:gis of typeIGrouping<AnonymousType#1, APP_PROD_COMP_tbl>qis of type IGrouping<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
    {
    };
}
于 2013-10-03T10:44:29.260 回答
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);

这不起作用,因为 typeofa与 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 类型是相同的。

您可以尝试从q和中的集合中选择相同的匿名类型g。阅读有关UnionIQueryable 的更多信息

Union onIQueryAble<TSource>()接受IQueryAble<TSource>作为参数,因此集合必须是相同的类型。

于 2013-10-03T09:56:26.710 回答