无法从类型:参数的表达式中提取值

时间:2014-11-18 09:25:27

标签: c# linq ravendb

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())));

1 个答案:

答案 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()