LINQ to Entity Union выдает ошибку - PullRequest
9 голосов
/ 11 февраля 2011

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

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» и наилучшей перегрузки метода расширения «System.Linq.Queryable.Union (System.Linq.IQueryable , System.Collections.Generic.IEnumerable ) 'содержит недопустимые аргументы

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

Ответы [ 2 ]

8 голосов
/ 11 февраля 2011

Когда вы создаете interactions, его тип не является анонимным типом int и DateTime, он имеет тип int и nullable DateTime.Это связано с тем, что в своем встроенном операторе if вы никогда не вызываете .Value из столбца, допускающего значение NULL.Ваш код должен работать, если вы создаете 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

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

0 голосов
/ 11 февраля 2011

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

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

transactions.Union(cases);

к этому:

var unionedQuery = transactions.Union(cases);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...