C# 在林克执行联盟

C# 在林克执行联盟,c#,linq,entity-framework-4,C#,Linq,Entity Framework 4,我正在尝试获取这两个查询的并集,但不断得到以下错误: '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&g

我正在尝试获取这两个查询的并集,但不断得到以下错误:

'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
我尝试在查询中使用IEnumerable,但仍然不起作用。我不太确定我在这一点上会错在哪里,尽管无可否认,LINQ不是我经常接触的东西

更新:


所以我走的方向与我之前发布的略有不同。在做了更多的研究后,
groupby
语句来自旧代码,不再用于预期目的。我将这些更改为
选择新的
语句,与工会没有进一步的问题。

问题是您的匿名类型不匹配:

 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);
但这是可行的,因为匿名类型是相同的

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


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

我认为这里的问题是类型不匹配:
g
属于类型
I分组
q
属于类型
I分组
;这就是为什么
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
    {
    };
}

@downvoter请解释为什么这是一个糟糕的解决方案?我看到他的匿名对象匹配,除非类型不匹配,否则我看不出你的建议。@TombMedia我建议使用APP_PROD_COMP_tbl=APP_COMP_tbl这样一组对象将不匹配,而union将不起作用只要a_B_G、a_MFG和a_PRODUCT_FAM的类型匹配,源就不重要。与queryable.nope无关,因为他将数据分组为APP_PROD_COMP_tbl和APP_COMP_tbl,所以没有选择,所以组中的底层对象是不同的类型,不能合并不同的类型(无论是列表、可枚举还是可查询)我一直在探索这个方向,直到我意识到分组发言是不必要的。
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
    {
    };
}