Я пытаюсь создать расширение для 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», если его нет?