2015-04-20 26 views
0

这是情况。使用LINQ执行GroupBy和Union获取记录

我想在使用LINQ的两个查询之间执行Union。我使用匿名类型在两个查询中应用了GroupBy。我不确切地知道,但可能匿名类型的使用导致我无法执行该联盟操作的这个问题。它显示了我的异常这样的:

“System.Linq.IQueryable”不包含 定义“联盟”和最佳推广方法重载 “System.Linq.ParallelEnumerable.Union(System.Linq的。 ParallelQuery, System.Collections.Generic.IEnumerable)”有一些无效 参数

下面是该查询:

var records = (from o in _context.Table1 
         join q in _context.Table2 on o.UserId equals q.UserId 
         group new { o, q } 
         by new { o.Name, o.Date, o.IsDone, o.IsDl, o.DateChanged, o.UserId, q.FirstName, q.LastName } into data 
         select new 
         { 
          NameP = data.Key.Name, 
          Date = data.Key.Date, 
          IsDone = data.Key.IsDone, 
          IsDl = data.Key.IsDl, 
          DateDone = data.Key.DateChanged, 
          Name = data.Key.FirstName +" "+ data.Key.LastName 
         }).Union(
          from i in _context.Table1 
          where i.UserId == null 
          group i by new {o.Name, o.Date, o.IsDone, o.IsDl, o.DateChanged, o.UserId} into newData 
          select new 
          { 
           NameP = newData.Key.Name, 
           Date= newData.Key.Date, 
           IsDone = newData.Key.IsDone, 
           IsDl = newData.Key.IsDl, 
           DateDone = ' ', 
           Name = ' ' 
          }).ToList(); 

我我试图在这里实现的是获得这两种情况的记录,当UserId为空以及当它不为空时使用组,因为记录重复。

任何意见或指导,在这里我做错了赞赏。

+1

确保两个匿名类型具有相同的数据类型,企业的性质所有..唯一的,我可以推测是日期的..也许第一个'DateDone'实际上是'DateTime'类型,并且您将第二个设置为'string' ... –

+0

因为您使用的是匿名类型。尝试创建虚拟结果类并尝试。或者你可以尝试全外连接。 http://stackoverflow.com/questions/5489987/linq-full-outer-join –

+0

@MichaelCoxon - 我明白你的观点。它应该是一个约会。让我试试这种方式。 –

回答

1

确保两个匿名类型的所有属性都具有相同的数据类型。

我唯一可以推测的是日期。也许第一DateDone实际上是一个DateTime类型和所设置的第二个到string ...

var records = (from o in _context.Table1 
       join q in _context.Table2 on o.UserId equals q.UserId 
       group new { o, q } 
       by new 
       { 
        o.Name, 
        o.Date, 
        o.IsDone, 
        o.IsDl, 
        o.DateChanged, 
        o.UserId, 
        q.FirstName, 
        q.LastName 
       } into data 
       select new 
       { 
        NameP = data.Key.Name, 
        Date = data.Key.Date, 
        IsDone = data.Key.IsDone, 
        IsDl = data.Key.IsDl, 
        DateDone = data.Key.DateChanged, 
        Name = data.Key.FirstName +" "+ data.Key.LastName 
       }).Union(from i in _context.Table1 
         where i.UserId == null 
         group i by new 
         { 
          o.Name, 
          o.Date, 
          o.IsDone, 
          o.IsDl, 
          o.DateChanged, 
          o.UserId 
         } into newData 
         select new 
         { 
          NameP = newData.Key.Name, 
          Date = newData.Key.Date, 
          IsDone = newData.Key.IsDone, 
          IsDl = newData.Key.IsDl, 
          DateDone = new DateTime(0), 
          Name = ' ' 
         }).ToList();