首页 > 解决方案 > LINQ 不包含“联合”的定义

问题描述

这个 linq 查询有什么问题,它告诉我不包含“联合”的定义的错误

(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();

标签: sqlasp.netasp.net-mvcentity-frameworklinq

解决方案


如果您包含using System.Linq; 并且两个匿名类型都具有完全相同的属性名称 + 属性类型,那么您所做的应该可以工作。

然而它不起作用。解决方案是检查您的匿名类型是否有 (a) 细微的属性名称差异和 (b) 细微的属性类型差异

例如,即使是intvs a smallintor doubleordecimal也会导致此构建错误:

“System.Collections.Generic.IEnumerable”不包含“Union”的定义,最好的扩展方法重载“System.Linq.Queryable.Union(System.Linq.IQueryable, System.Collections.Generic.IEnumerable)”有一些无效参数

切换到.Concat()不会解决这个问题:它具有相同(明显)的限制,即双方的类型必须兼容。

解决命名或键入问题后,我建议您考虑切换到.Concat(). 原因:.Union()将调用.Equals()所有对象来消除重复,但这是没有意义的,因为没有两个独立创建的匿名对象将永远是同一个对象(即使它们的内容相同)。

或者,如果您的特定意图是消除重复,那么您需要创建一个类来保存您的数据并以.Equals()有意义的方式实现。


推荐阅读