Как назначить свойство nullable int анонимного типа в LINQ с объединением?

у меня есть два оператора select в LINQ с Union.

A RoleID должно иметь нулевое значение в одном из вариантов. Я получаю ошибку ниже.

если RoleID имеет значение, он отлично работает. Отчеты-это объект EF со свойствами.

это может быть что угодно в этом примере. Пример просто для иллюстрации.

код в LinqPad:

var list = Reports.Select(r => new
    {
        RoleID = 3
    })
    .Union(Reports.Select(r => new
    {
        RoleID = new Nullable<int>()    <= error
        //RoleID = (int?) null          <= error
        //RoleID = 4                    <= works
    }));
list.Dump();

как заставить его работать с нулевым значением и сделать RoleID типа int?

Сообщение Об Ошибке:

'.В LINQ.IQueryable "не содержит определения для системы "Union" и "Best extension method overload".В LINQ.ParallelEnumerable.Союз (Система.В LINQ.ParallelQuery, System.Коллекции.Родовой.Интерфейс IEnumerable)' имеет некоторые недопустимые аргументы Аргумент экземпляра: не удается конвертировать из 'системы.В LINQ.IQueryable ' to ' System.В LINQ.ParallelQuery'

2 ответов


первый Select запрос возвращает последовательность анонимных объектов, где RoleID тип int. Для объединения обеих последовательностей они должны иметь один и тот же тип анонимных объектов. Поэтому вам нужно изменить первый запрос:

var list = Reports.Select(r => new
                {
                    RoleID = (int?)3
                })

имейте в виду, во втором запросе вы также должны иметь nullable RoleID чтобы соответствовать типу анонимного объекта:

 .Union(Reports.Select(r => new
    {
        RoleID = new Nullable<int>() 
        //RoleID = (int?)null
        //RoleID = (int?)4
    }));

BTW почему соединение на двух выбирает из того же источника? Похоже, вы слишком упростили свои примеры запросов.


вам нужно RoleID чтобы быть nullable и в первом анонимном классе:

Reports.Select(r => new
               {
                   RoleID = (int?)3
               }

Смотрите также эти вопросы: