2015-04-20 29 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();