在LINQ中执行联合

时间:2013-10-03 09:44:48

标签: 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>, 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语句,并且对工会没有进一步的问题。

2 个答案:

答案 0 :(得分:2)

我认为您的问题是类型不匹配:g类型为IGrouping<AnonymousType#1, APP_PROD_COMP_tbl>q类型为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
    {
    };
}

答案 1 :(得分: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);

这不起作用,因为a的typeof与b

的typeof不同
 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类型是相同的。

您可以尝试在qg中从您的收藏中选择相同的匿名类型。阅读有关IQueryable

Union的更多信息

IQueryAble<TSource>()上的联盟接受IQueryAble<TSource>作为参数,因此集合必须是同一类型。