Обходной путь для DefaultIfEmpty - PullRequest
1 голос
/ 24 марта 2020

У меня есть что-то вроде этого:

public enum CoolEnum
{
  Yes = 0,
  No = 1,
  Perhaps = 2,
  Maybe = 3,
  Perchance = 4,
}

, и я хочу сделать следующее:

CoolEnum? enum = await this.context
                .MyTable
                .Where(x => x.Id == id)
                .Select(x => x.CoolEnum)
                .DefaultIfEmpty((CoolEnum?)null)
                .FirstAsync();

, но я получаю ошибку

Processing of the LINQ expression 'DefaultIfEmpty<Nullable<CoolEnum>> (...) failed.
This may indicate either a bug or a limitation in EF Core. 

Как Я видел здесь , кажется, это известная проблема с низким приоритетом.

Тогда я подумал, что могу сделать следующее:

CoolEnum enum = await this.context
                .MyTable
                .Where(x => x.Id == id)
                .Select(x => x.CoolEnum)
                .FirstAsync();

CoolEnum? nullableEnum = enum == default ? null : enum;

Но это изменит все мои существующие перечисления со значением по умолчанию, равным нулю, и это не то, что я хочу.

Какой чистый обходной путь можно использовать? Я вижу следующие параметры:

  • Возвращает весь объект MyTable. Но если он большой, то это пустая трата ресурсов.
  • Определите «нулевой» элемент по умолчанию в моем Enum.
  • Разделите запрос на 2 запроса, один, чтобы увидеть, есть ли элементы и другой, чтобы получить элемент.

Ни один из них не кажется чистым. Есть идея получше?

1 Ответ

2 голосов
/ 24 марта 2020

Вы можете выбрать обнуляемое значение (используя обычное C# приведение к соответствующему обнуляемому типу), а затем FirstOrDefault{Async}:

.Select(x => (CoolEnum?)x.CoolEnum)
.FirstOrDefaultAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...