Как назначить свойство 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
}
Смотрите также эти вопросы:
- два анонимных классов будет один и тот же тип, если они используют те же свойства, с теми же типами, в том же порядке: важен ли порядок полей при автоматической инициализации анонимных типов?
- вы также можете создать список анонимного типа и добавить к нему:добавить анонимный класс возражение против анонимного списка
- кроме того, вы обычно хотите использовать
Concat
, а неUnion
: союз против Конката в Linq