public class Objekt
{
public Foo[] FooList{ get; set; }
}
public class Foo
{
public string Value{ get; set; }
}
在我的查询RavenDb中,我想匹配每个在FooList中有一个条目的Objekt,它的字符串属性“Item”以字符串表中的任何字符串开头。
tableStrings是一个字符串[]。
var query = session.Query<Objekt>();
query = query.Where(x=> tableStrings.Any(y => x.FooList.Any(s => s.Value.StartsWith(y))));
我有这样的错误:“无法从类型的表达式中提取值:参数”
有关信息,如果我只使用tableStrings的第一项,则可以:
query = query.Where(x => x.FooList.Any(y => y.Value.StartsWith(tableStrings.First())));
答案 0 :(得分:2)
您可以使用索引高效:
public class ObjektFooListIndex : AbstractIndexCreationTask<Objekt, ObjektFooListIndex.Result> {
public class Result {
public string[] Values;
}
public ObjektFooListIndex() {
Map = objekts => from objekt in objekts
select new {
Values = objekt.FooList.Select(x => x.Value).ToArray()
};
Index(x => x.Values, Raven.Abstractions.Indexing.FieldIndexing.NotAnalyzed);
}
}
现在您可以搜索Foo.Value
字符串的内容:
var result = session.Query<ObjektFooListIndex.Result, ObjektFooListIndex>()
.Search(x => x.Values, "ein*", escapeQueryOptions: EscapeQueryOptions.AllowPostfixWildcard)
.AsProjection<Objekt>()
.ToList();
结果将是Objekt
的列表。要搜索多个字词,请多次使用Search()
。
var result = session.Query<ObjektFooListIndex.Result, ObjektFooListIndex>()
.Search(x => x.Values, "ein*", escapeQueryOptions: EscapeQueryOptions.AllowPostfixWildcard, options: SearchOptions.Or)
.Search(x => x.Values, "dr*", escapeQueryOptions: EscapeQueryOptions.AllowPostfixWildcard, options: SearchOptions.Or)
.AsProjection<Objekt>()
.ToList();
您可以根据自己的需要轻松扩展它。
要创建索引,请使用IndexCreation.CreateIndexes()
。