Метод Ravendb Session.Query < T > () не возвращает никакого результата при отправке Expression < Func < T, bool > > > to Where () Метод расширения

BTajahmadi спросил: 28 апреля 2018 в 08:49 в: linq

У меня проблема с Ravendb session.Query.Where (). Когда я использую его так, он отлично работает и возвращает все UserIdentitiy с именем пользователя "John":

users = session.Query<UserIdentity>().Where(x => x.UserName == "John").ToList();

Но когда я пытаюсь отправить выражение как переменную в метод Where, он терпит неудачу и ничего не возвращает.

Expression<Func<UserIdentity, bool>> whereClause = x => x.UserName == "John";using (var session = _store.OpenSession())
{
    users = session.Query<UserIdentity>().Where(whereClause).ToList();
}

Что случилось?


1 ответ

Есть решение
Mrinal Kamboj ответил: 28 апреля 2018 в 10:13

Попробуйте использовать следующий код:

public static class ExpressionTreesExtension
{    public static Expression<Func<T, bool>> EqualExpression<T>(string columnName,object value)
    {
        ParameterExpression parameterType = Expression.Parameter(typeof(T), "object");        MemberExpression typeColumn = Expression.Property(parameterType, columnName);        ConstantExpression constant = Expression.Constant(value, typeof(string));        BinaryExpression binaryExpression = Expression.Equal(typeColumn, constant);        return Expression.Lambda<Func<T, bool>>(binaryExpression, parameterType);
    }
}

Использование кода:

Expression<Func<UserIdentity, bool>> whereClause = ExpressionTreesExtension.EqualExpression<UserIdentity>("UserName","John");
usr ответил: 28 апреля 2018 в 10:14
Почему это лучше?
Mrinal Kamboj ответил: 28 апреля 2018 в 10:15
Не лучше, пример OP идеально работает, но я могу догадаться, что API Raven DB неправильно анализируют выражение, непосредственно предоставляемое методу, просто обходное решение. В основном это проблема синтаксического выражения.