我正在尝试获取这两个查询的并集,但不断收到以下错误:
'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
语句,并且对工会没有进一步的问题。
答案 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
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
中从您的收藏中选择相同的匿名类型。阅读有关IQueryable
Union
的更多信息
IQueryAble<TSource>()
上的联盟接受IQueryAble<TSource>
作为参数,因此集合必须是同一类型。