Entity Framework: расширение SingleDistinctOrDefault с одним запросом к базе данных - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь создать расширение для IQueryable<T>, которое для селектора возвращает одно отдельное значение, или default(T) для отсутствующих или нескольких разных значений с помощью одного запроса к базе данных. Он не должен загружать несколько строк из базы данных.

Допустим, T равно int результаты должны быть:

[] => 0

[1, 1, 1] => 1

[1, 2, 1] => 0

У меня уже есть рабочее расширение:

public static TResult SingleDistinctOrDefault<TSource, TResult>
    (this IQueryable<TSource> @this, Expression<Func<TSource, TResult>> distinctSelector)
{
    var distinctValues = @this.Select(distinctSelector).Distinct();
    return distinctValues.Count() == 1 ? distinctValues.First() : default(TResult);
}

Пример использования: new[] {1, 1, 1}.AsQueryable().SingleDistinctOrDefault(i => i)

Я хочу только один запрос к базе данных, но расширение выше создает два запроса. Один для проверки distinctValues.Count() и один для возврата distinctValues.First(). Можно ли объединить этот запрос LINQ, чтобы он не запрашивал базу данных дважды?

Я думал об использовании GroupBy(), но я не знаю, что с этим делать.

Смежный вопрос: Как проверить, имеют ли все элементы списка одинаковое значение, и вернуть его или вернуть «otherValue», если его нет?

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