[c#]不能提取类型的表达式的值︰ 参数

标签: Linq C#
发布时间: 2017/2/28 22:35:57
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.
public class Objekt
{
    public Foo[] FooList{ get; set; }
}

public class Foo
{
    public string Value{ get; set; }
}

在我的查询 RavenDb,我想要匹配条目在 FooList 有其字符串属性"项"开始的任何字符串的字符串表中每个对象。

tableStrings 是 string []。

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:

你能做那有效地使用索引︰

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

赞助商