这个linq查询有什么问题,它显示了不包含'union'的定义的错误
(from rev in db.vM29s
where Years.Contains(rev.FinancialYear) && rev.Exclude=="No"
group rev by new { rev.RevenueCode, rev.FinancialYear } into g
select new
{
Revenuecode = g.Key.RevenueCode,
totalRevenue = g.Sum(x => x.RevenueAmount),
RevenueEnglish = (from a in db.RevenueCodes where a._RevenueCode == g.Key.RevenueCode select a.RevenueEng).FirstOrDefault(),
// MinorCode = (from a in db.MinorCodes where a._MinorCode == g.Key.MinorCode select a.MinorEng),
RevenueDari = (from a in db.RevenueCodes where a._RevenueCode == g.Key.RevenueCode select a.RevenueDari).FirstOrDefault(),
Yearss = g.Key.FinancialYear
}
)
.Union
(from u in db.rtastable
where Years.Contains(u.Year)
group u by new { u.objectcode, u.Year } into g
select new
{
Revenuecode = g.Key.objectcode,
totalRevenue = g.Sum(x => x.amount),
RevenueEnglish = (from a in db.RevenueCodes where a._RevenueCode == g.Key.objectcode select a.RevenueEng).FirstOrDefault(),
// MinorCode = (from a in db.MinorCodes where a._MinorCode == g.Key.MinorCode select a.MinorEng),
RevenueDari = (from a in db.RevenueCodes where a._RevenueCode == g.Key.objectcode select a.RevenueDari).FirstOrDefault(),
Yearss = g.Key.Year
}
)
.ToList();
2条答案
按热度按时间9jyewag01#
如果您包含了
using System.Linq;
* 和 *,则两个匿名类型都具有完全相同的属性名称+属性类型,那么您所做的应该会起作用。解决办法是检查匿名类型是否存在细微的属性名称差异和/或细微的属性类型差异。
例如,即使
int
与smallint
或double
或decimal
相比也会导致此构建错误:“System.Collections.Generic.IEnumerable〈AnonymousType#1〉"不包含”Union“的定义,并且最佳扩展方法重载”System.Linq.Queryable.Union(System.Linq.IQueryable,System.Collections.Generic.IEnumerable)“具有一些无效参数
切换到
.Concat()
不会修复此问题:它具有相同的(明显的)限制,即两侧的类型必须兼容。在您解决了命名或键入问题之后,我建议您考虑切换到
.Concat()
。.Union()
将在所有对象上调用.Equals()
以消除重复项,但这毫无意义,因为独立创建的两个匿名对象永远不会是同一个对象(即使它们的内容相同)。如果消除重复项是您的“特定意图”,那么您需要创建一个类来保存您的数据,并以一种有意义的方式实现
.Equals()
。xesrikrc2#
如果数据已在内存中,则应使用Concat或addRange。