C# RavenDB where子句的自定义表达式:字段包含所提供数组中的任何项
你能帮我复习一下那些似乎都不起作用的表达方式吗 正在尝试查找记录属性C# RavenDB where子句的自定义表达式:字段包含所提供数组中的任何项,c#,linq,lambda,expression,ravendb,C#,Linq,Lambda,Expression,Ravendb,你能帮我复习一下那些似乎都不起作用的表达方式吗 正在尝试查找记录属性@位于提供的值数组中的记录 RavenDB 3.5引发异常,无法理解指定的表达式 我试图避免使用客户端sdk,并使用自定义表达式来解决此问题,可以使用类似的sdk。在扩展中,也可以使用可枚举的任何 谢谢你的帮助 System.NotSupportedException: 'Could not understand expression void Main() { var exp=ByPersonNameIn(新[]{“Walt
@位于提供的值数组中的记录
RavenDB 3.5引发异常,无法理解指定的表达式
我试图避免使用客户端sdk,并使用自定义表达式来解决此问题,可以使用类似的sdk。在
扩展中,也可以使用可枚举的任何
谢谢你的帮助
System.NotSupportedException: 'Could not understand expression
void Main()
{
var exp=ByPersonNameIn(新[]{“Walter”});
//var exp=ByPersonNameAny(新[]{“Walter”});
var persons=新列表()
{
新人{Name=“Walter”},
新人{Name=“Jesse”},
新人{Name=“Walter”},
};
//表达式在这里有效,但在IRavenQueryable不起作用。在哪里
var res=persons.Where(exp.Compile()).ToList();
资源转储(资源名称);
}
私有表达式ByPersonNameIn(字符串[]名称)
{
var person=表达式参数(typeof(person),“person”);
var personProp=Expression.PropertyOrField(person,nameof(person.Name));
var namesParam=Expression.Constant(名称、类型(字符串[]));
var@in=typeof(StringExt).GetMethod(“in”,new[]{typeof(string),typeof(IEnumerable)});
var infe=Expression.Call(@in,personProp,namesParam);
返回表达式.Lambda(infe,person);
}
私有表达式ByPersonNameAny(字符串[]名称)
{
var person=表达式参数(typeof(person),“person”);
var name=Expression.Parameter(typeof(string),“name”);
var namesParam=Expression.Constant(名称、类型(字符串[]));
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));
返回表达式.Lambda(@any,person);
}
公共阶层人士
{
公共字符串名称{get;set;}
}
公共静态类StringExt
{
公共静态布尔输入(此字符串字段,IEnumerable值)
{
返回值.Any(value=>field.Equals(value));
}
公共静态布尔输入(此字符串字段,参数字符串[]值)
{
返回值.Any(value=>field.Equals(value));
}
}
RavenDB库的LINQ提供程序中有代码,可以将IRavenQueryable
上的查询转换为RavenDB可以理解的查询(RQL)。此转换仅限于它专门编写用来处理的方法(和运算符等),当您带来它不理解的东西时,例如您自己的扩展方法,它会抛出异常以指示您已“脱离边缘”
大多数LINQ提供者理解模式var personNames=new[]{“Walter”};something.Where(person=>personNames.Contains(person))
来做你想做的事情-即Where用于在任何查询中执行。我认为用这种方法构建表达式树是可行的。在您的示例中,直接在LINQ查询中使用它而不是自定义方法也可以。似乎没有办法扩展LINQ提供者来教它如何翻译您的方法 RavenDB库的LINQ提供程序中有代码,可以将IRavenQueryable
上的查询转换为RavenDB可以理解的查询(RQL)。此转换仅限于它专门编写用来处理的方法(和运算符等),当您带来它不理解的东西时,例如您自己的扩展方法,它会抛出异常以指示您已“脱离边缘”
大多数LINQ提供者理解模式var personNames=new[]{“Walter”};something.Where(person=>personNames.Contains(person))
来做你想做的事情-即Where用于在任何查询中执行。我认为用这种方法构建表达式树是可行的。在您的示例中,直接在LINQ查询中使用它而不是自定义方法也可以。似乎没有办法扩展LINQ提供者来教它如何翻译您的方法 我在
中将
@模仿为
或“幸运”,这并不理想,但在我找到更好的方法之前应该暂时有效
私有静态表达式ByPropertyViaEqOr(string propName,string[]值)
{
var doc=表达式参数(typeof(TDocument),“doc”);
var eq=values.Select(value=>bypropertyviaq(propName,value));
var orElse=eq.Aggregate((l,r)=>Expression.orElse(l,r));
返回表达式.Lambda(orElse,doc);
}
私有静态表达式ByPropertyViaEq(字符串propName,字符串值)
{
var doc=表达式参数(typeof(TDocument),“doc”);
var docProp=Expression.PropertyOrField(doc,propName);
var propValue=表达式.常量(值,类型(字符串));
返回表达式.Equal(docProp,propValue);
}
我在中将@模仿为或“幸运”,这并不理想,但在我找到更好的方法之前应该暂时有效
私有静态表达式ByPropertyViaEqOr(string propName,string[]值)
{
var doc=表达式参数(typeof(TDocument),“doc”);
var eq=values.Select(value=>bypropertyviaq(propName,value));
var orElse=eq.Aggregate((l,r)=>Expression.orElse(l,r));
返回表达式.Lambda(orElse,doc);
}
私有静态表达式ByPropertyViaEq(字符串propName,字符串值)
{
var doc=表达式参数(typeof(TDocument),“doc”);
var docProp=Expression.PropertyOrField(doc,propName);
var propValue=表达式.常量(值,类型)