Search code examples
c#sqlasp.netentity-frameworklinq

LINQ Does not contain a definition for 'union'


what is wrong with this linq query that show me the error of Does not contain a definition for '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();

Solution

  • If you included using System.Linq; and both Anonymous Types have exactly the same property names + property types, then what you did should work.

    Yet it does not work. The solution is to check your Anonymous Types for subtle property name differences and/or subtle property type differences.

    E.g. even an int vs a smallint or double or decimal will cause this build error:

    'System.Collections.Generic.IEnumerable<AnonymousType#1>' does not contain a definition for 'Union' and the best extension method overload 'System.Linq.Queryable.Union(System.Linq.IQueryable, System.Collections.Generic.IEnumerable)' has some invalid arguments

    Switching to .Concat() will not fix this: it has the same (obvious) restriction that the types on both sides must be compatible.

    After you fix the naming or typing problem, I would recommend that you consider switching to .Concat(). The reason: .Union() will call .Equals() on all objects to eliminate duplicates, but that is pointless because no two Anonymous Objects that were created independently will ever be the same object (even if their contents would be the same).

    If it was your specific intention to eliminate duplicates, then you need to create a class that holds your data and that implements .Equals() in a way that makes sense.