【问题标题】:LINQ Does not contain a definition for 'union'LINQ 不包含“联合”的定义
【发布时间】:2019-04-15 01:37:29
【问题描述】:

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

【问题讨论】:

  • LINQ 不能替代 SQL。不要一开始就写这样的代码。 LINQ 是一种基于 ORM 的查询语言。这个查询虽然与对象和关系无关。
  • @PanagiotisKanavos 这是真的,但如何解决这个错误?我认为这个查询没有错误,但为什么它显示这个错误?
  • 先转换为 ToList().Union(etc...)

标签: sql asp.net asp.net-mvc entity-framework linq


【解决方案1】:

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

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

例如即使是 intsmallintdoubledecimal 也会导致此构建错误:

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

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

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

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

【讨论】:

    【解决方案2】:

    您应该使用Concat 或使用addRange 如果数据已经在内存中。

    【讨论】:

    • 当产生不同的结果时,为什么要这样做? Concat 不是联合,不是 SQL,也不是 Linq。
    猜你喜欢
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2013-07-09
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多