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);
这不起作用,因为typeofa
与typeofb
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
{
};
}