#c# #asp.net #asp.net-core #lambda #expression-trees
#c# #asp.net #asp.net-core #лямбда #деревья выражений
Вопрос:
Я создаю дерево выражений на основе условного оператора, но я не могу получить требуемый фильтр, работающий с функцией MongoDB.
Вот моя функция
public Task<long> GetUserCountAsync(string tenantId, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
Expression<Func<TUser, bool>> filter = t => string.IsNullOrWhiteSpace(tenantId) ? t.TenantId != null : t.TenantId == tenantId;
return await mongoCollection.CountDocumentsAsync(filter);
}
когда я запускаю приведенный выше код, я получил следующую ошибку
Мой вопрос в том, как построить дерево выражений с помощью условного оператора?
Expression<Func<TUser, bool>> filter = t => string.IsNullOrWhiteSpace(tenantId) ? t.TenantId != null : t.TenantId == tenantId;
Ответ №1:
Проблема в том, что база данных не поддерживает выражение, которое вы пытаетесь построить.
Измените подход. Не включайте условие в само выражение
//...
Expression<Func<TUser, bool>> filter = t => t.TenantId == tenantId;
if(string.IsNullOrWhiteSpace(tenantId))
filter = t => t.TenantId != null;
//...
Комментарии:
1. ваш первый предложенный код не работает. У меня ошибка, в которой говорится, что «Тип условного выражения не может быть определен, потому что нет неявного преобразования между «лямбда-выражением» и «лямбда-выражением», хотя второе работает. Есть причина, почему?
2. В этом случае я удалю его и перейду к более подробному