Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# RavenDB where子句的自定义表达式:字段包含所提供数组中的任何项_C#_Linq_Lambda_Expression_Ravendb - Fatal编程技术网

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=表达式.常量(值,类型)