Выполнение GroupBy и Union с использованием LINQ для извлечения записей

Вот ситуация.

Я пытаюсь выполнить Union между двумя запросами с использованием LINQ. Я применил GroupBy в обоих запросах, используя анонимные типы. Я не знаю точно, но, вероятно, использование анонимного типа приводит меня к этой проблеме, когда я не могу выполнить эту операцию Union. Это показывает мне исключение, как это:

System.Linq.IQueryable не содержит определения для Union и лучшей перегрузки метода расширения. 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 имеет значение null, а также когда его значение не равно null при использовании group by, поскольку записи повторяются.

Любые предложения или указания о том, что я делаю неправильно, приветствуются.

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();
Другие вопросы по тегам