LINQ to Entities Union выдает ошибку

Мне удалось добиться следующих результатов:

var transactions = from t in context.Transactions group t.Create_Date_Time by t.Participation_Id into t1 select new { ParticipationId = t1.Key, CreateDateTime = t1.Max() }; var cases = from c in context.Cases group c.Create_Date_Time by c.Participation_Id into c1 select new { ParticipationId = c1.Key, CreateDateTime = c1.Max() }; var interactions = from i in context.Interactions join pp in context.Party_Participation on i.Party_Id equals pp.Party_Id group i.Last_Update_Date_Time.HasValue ? i.Last_Update_Date_Time : i.Create_Date_Time by pp.Participation_Id into i1 select new { ParticipationId = i1.Key, CreateDateTime = i1.Max() }; transactions.Union(cases); 

Однако, наконец, когда я пытался добавить третий выход,

 transactions.Union(interactions); // or interactions.Union(transactions); 

Я получил следующую ошибку

в любом случае он бросает следующую ошибку

Ошибка 1 Аргумент экземпляра: невозможно преобразовать из ‘System.Collections.Generic.List ‘ в ‘System.Linq.IQueryable ‘
Ошибка 2 ‘System.Collections.Generic.List ‘ не содержит определения для ‘Union’ и лучший метод расширения overload ‘System.Linq.Queryable.Union (System.Linq.IQueryable , System.Collections.Generic.IEnumerable ) ‘имеет некоторые недопустимые аргументы

Единственная разница в третьей последовательности, я использую соединение с другой таблицей. Я попробовал .AsEnumerable() , .ToList() и .ToArray() , ни один из них не помог.

Когда вы создаете interactions , его тип не является анонимным типом int и DateTime, он имеет значение int и nullable DateTime. Это связано с тем, что в вашем встроенном if-заявлении вы никогда не вызываете. .Value нулевой столбец. Ваш код должен работать, если вы создаете такие interactions :

 var interactions = from i in context.Interactions join pp in context.Party_Participation on i.Party_Id equals pp.Party_Id group i.Last_Update_Date_Time.HasValue ? i.Last_Update_Date_Time.Value : i.Create_Date_Time by pp.Participation_Id into i1 select new {ParticipationId = i1.Key, CreateDateTime = i1.Max()}; 

Простой пример:

 var lst = new int?[] { 2,3,null,5,5 }; var lst2 = new int[] { 2,3,4,5,6 }; lst.Select(x => x.HasValue ? x.Value : 0).Union(lst2); //works fine lst.Select(x => x.HasValue ? x : 0).Union(lst2); //throws error lst.Select(x => x ?? 0).Union(lst2); //also works 

Несмотря на то, что мы можем легко увидеть, что оператор inline if никогда не вернет нулевое значение в любом случае, компилятор не сможет сделать такие гарантии и должен ввести возвращаемое значение в значение nullable int во втором случае.

Скорее всего, t1.Key и i1.Key – разные типы. Анонимные типы должны иметь одинаковые имена и типы свойств, объявленные в том же порядке, чтобы вы могли объединить их.

В качестве дополнительной заметки вы, вероятно, также захотите изменить эту строку своего кода:

 transactions.Union(cases); 

к этому:

 var unionedQuery = transactions.Union(cases); 

иначе он не будет выполнять объединение, потому что вы не сохранили полученный запрос.