C # Построить дерево выражений на основе условного оператора для использования с фильтром MongoDB

#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. В этом случае я удалю его и перейду к более подробному