在 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
声明,与工会没有进一步的问题。
我认为你这里的问题是类型不匹配: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
{
};
}
问题是您的匿名鼠标类型不匹配:
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);
但这将起作用,因为匿名鼠类型是相同的。
您可以尝试从q
和g
的集合中选择相同的匿名鼠标类型。阅读更多 关于 IQueryable Union
IQueryAble<TSource>()
上的联合接受IQueryAble<TSource>
作为参数,因此集合必须是相同的类型。