Не могли бы вы помочь в рассмотрении выражений, которые, похоже, не работают?
Попытка найти записи, в которых свойство записи @In
предоставляет предоставленный массив значений.
RavenDB 3.5 вызывает исключение, котороеему не удалось понять указанное выражение.
Я пытаюсь избежать использования клиента sdk и разрешить его с помощью пользовательских выражений, либо с аналогичным расширением sdk .In
, либо Enumerable.Any
.
* 1011. * Любая помощь приветствуется
System.NotSupportedException: 'Could not understand expression
void Main()
{
var exp = ByPersonNameIn(new[] { "Walter" });
//var exp = ByPersonNameAny(new[] { "Walter" });
var persons = new List<Person>()
{
new Person { Name = "Walter" },
new Person { Name = "Jesse" },
new Person { Name = "Walter" },
};
// Expression works here, but not at IRavenQueryable.Where
var res = persons.Where(exp.Compile()).ToList();
res.Dump(nameof(res));
}
private Expression<Func<Person, bool>> ByPersonNameIn(string[] names)
{
var person = Expression.Parameter(typeof(Person), "person");
var personProp = Expression.PropertyOrField(person, nameof(Person.Name));
var namesParam = Expression.Constant(names, typeof(string[]));
var @in = typeof(StringExt).GetMethod("In", new[] { typeof(string), typeof(IEnumerable<string>) });
var inExp = Expression.Call(@in, personProp, namesParam);
return Expression.Lambda<Func<Person, bool>>(inExp, person);
}
private Expression<Func<Person, bool>> ByPersonNameAny(string[] names)
{
var person = Expression.Parameter(typeof(Person), "person");
var name = Expression.Parameter(typeof(string), "name");
var namesParam = Expression.Constant(names, typeof(string[]));
var @eq = Expression.Equal(name, (Expression.PropertyOrField(person, nameof(Person.Name))));
var @any = Expression.Call(typeof(Enumerable), "Any", new[] { typeof(string) }, namesParam, Expression.Lambda(@eq, name));
return Expression.Lambda<Func<Person, bool>>(@any, person);
}
public class Person
{
public string Name {get;set;}
}
public static class StringExt
{
public static bool In(this string field, IEnumerable<string> values)
{
return values.Any(value => field.Equals(value));
}
public static bool In(this string field, params string[] values)
{
return values.Any(value => field.Equals(value));
}
}