在 LINQ 中执行联合

本文关键字:执行 LINQ | 更新日期: 2023-09-27 18:33:47

我试图获取这两个查询的并集,但不断收到以下错误:

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

在 LINQ 中执行联合

我认为你这里的问题是类型不匹配:gIGrouping<AnonymousType#1, APP_PROD_COMP_tbl>类型,qIGrouping<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
    {
    };
}

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

 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类型与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);

但这将起作用,因为匿名鼠类型是相同的。

您可以尝试从qg的集合中选择相同的匿名鼠标类型。阅读更多 关于 IQueryable Union

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