1

PredicateBuilder クラスを使用して、RavenDB が解釈して使用できる WHERE 句を構築することは可能ですか? session.Query() と LuceneQuery を試しましたが、それぞれ失敗しました:

session.Query() の試みは次のとおりです。

public static List<T> GetObjectList<T>(Expression<Func<T, bool>> whereClause)
{
    using (IDocumentSession session = GetRavenSession())
    {
        return session.Query<T>().Where(whereClause).Take(int.MaxValue).ToList();
    }
}

これは実行時エラーです。

Lucene.Net.QueryParsers.ParseException: '( OR) OR' を解析できません: 行 1、列 2 で " "OR "" が見つかりました。

LuceneQuery() を試してみると、次のようになります。

public static List<T> GetObjectList<T>(Expression<Func<T, bool>> whereClause)
{
    Func<T, bool> compiledWhereClause = whereClause.Compile();

    using (IDocumentSession session = GetRavenSession())
    {
        return session.Advanced.LuceneQuery<T>().Where(compiledWhereClause).Take(int.MaxValue).ToList();
    }
}

のコンパイル時エラーが発生します。

エラー 2 'Raven.Client.IDocumentQueryBase>.Where(System.Func)' は廃止されました: ' Where(x=>x.Name == "Ayende") などのインメモリ フィルタを IDocumentQuery で発行することはできません。

編集:これは、最初の例で whereClause がどのように見えるかです:

{f => ((False OrElse Invoke(x => (Convert(x).EquipmentId == value(ReadFromRaven.Logic.Readers.RavenReader 1+<>c__DisplayClassa[WriteToRaven.Data.Marker]).tempCoater.MarkerEquipmentId), f)) OrElse Invoke(x => (Convert(x).EquipmentId == value(ReadFromRaven.Logic.Readers.RavenReader1+<>c__DisplayClassa[WriteToRaven.Data.Marker]).tempCoater.MarkerEquipmentId)), f))}

編集 2: これが WHERE 句の作成方法です

これは呼び出しです:

List<T> newList = RavenDataAccess.GetObjectList<T>(BuildWhereClause(x => x.MarkerReadTime > timeChunk.StartTime && x.MarkerReadTime <= timeChunk.EndTime));

そして、これは BuildWhereClause() メソッドの署名と重要なメソッドの部分です:

private static Expression<Func<T, bool>> BuildWhereClause(Expression<Func<T, bool>> readTimeExpression)

    Expression<Func<T, bool>> innerWhereClause = PredicateBuilder.False<T>();

    foreach (Coater coater in coaters)
    {
        var tempCoater = coater;
        innerWhereClause = innerWhereClause.Or<T>(x => x.EquipmentId == tempCoater.MarkerEquipmentId);
    }

    Expression<Func<T, bool>> outerWhereClause = PredicateBuilder.True<T>();
    outerWhereClause = outerWhereClause.And<T>(readTimeExpression);
    outerWhereClause = outerWhereClause.And<T>(innerWhereClause);

    _whereClause = innerWhereClause;

    return _whereClause;
4

2 に答える 2

1

同じエラーがあります。これが私が解決する方法です:

http://www.albahari.com/nutshell/predicatebuilder.aspxのpredicateBulderを使用し、次のように呼び出します。Session.Query()。Where(predicate.Compile())。ToList(); 私がpredicate.Compile()methedと呼んだことに注意してください。

于 2012-04-30T22:49:58.013 に答える
0

クエリに渡そうとしている実際の式は何ですか?

クエリを動的に構築する場合は、Luceneクエリを使用し、linqを使用して動的に何かを構築しようとしないでください。

于 2012-04-24T04:09:58.943 に答える