我们在项目中使用RavenDB
,我们有一个搜索面板,允许用户使用不同的标准搜索文档。以建筑时代为例。这些输入数据是从查询字符串中的Web客户端发送的,我必须将它们翻译成Lucene语法才能从RavenDB
获得结果,但我认为它会更容易我依靠Raven Linq Provider为我做这份工作,而不是:
Age_Range : [Ix5 TO NULL]
我可以:
b=>b.Age>=5
然后,我所要做的就是将此字符串转换为lambda表达式。
我现在正在做的是编译这样的代码:
public class BuildingQueryBuilderXYZ:IQueryBuilder<Building>
{
public IRavenQueryable<Building> BuildQuery(IDocumentSession session)
{
return session.Query<Building>().Where(b=>b.Age>=5);
}
}
它正在工作,但我必须为每个请求编译一个程序集,这不是搜索数据库的有效方法。
如果我能找到将此字符串b=>b.Age>=5
转换为lambda表达式的方法,我认为我的问题将会解决:)
答案 0 :(得分:5)
我发现Dynamic Linq Library以某种方式做我想做的事情,但它有自己的语法(与linq不同)。这是一个例子:
var query = session.Query<Person>().Where("Age <= 11 And Age >= 5");
它正在工作:)
UPDATE :如果我想在Lucene语法中编写相同内容,那么它将是:Age_Range : [Ix5 TO Ix11]
。并且I
在这里表示整数,这意味着我必须知道类型才能生成正确的查询,但在第一个版本中,我关心的是Age
是一个数字,我将它留给{{ 1}}为我做魔术:)