1

たとえば、MongoDb では述語をクエリ可能なインスタンスに渡すことができます

DataBase.GetCollection<BsonDocument>("entity")
    .AsQueryable<Entity>()
    .Where(item=>item.id ==5);

しかし、今、私はこのような機能を持っています

IEnumerbale QueryData(Predicate<Entity> condition)
{
    this.DataBase.GetCollection<BsonDocument>("entity")
        .AsQueryable<Entity>()
        .Where(item=> condition(item));
}

しかし、これは機能せず、次のように伝えます:

サポートされていない where 句: 。

これは設計どおりですか?回避策はありますか?私は何か間違ったことをしていますか?

4

3 に答える 3

4

あなたは式を渡していません。あなたの条件は、MongoDB にとって完全に不透明な関数です。

Expression<Func<Entity,bool>>次のように Whereを渡して呼び出す必要があります。

Where(condition)
于 2012-06-13T18:38:03.830 に答える
2

Where 句は、サーバーに送信される MongoDB クエリに変換する必要があります。そのような任意の述語を渡すと、LINQ レイヤーはそれを何に変換するかわかりません。そのため、そのタイプの制限のない Where 句はサポートできません。

于 2012-06-13T18:17:54.210 に答える
0

Lambda 式をパラメータとして渡し、mongodb コレクションからデータをフィルタリングします。あなたのデータフィルター機能は

public IEnumerable<BsonDocument> FindAllWithPredicate(Func<BsonDocument, bool> condition)
{
    return Collection.AsQueryable().Where(condition).ToArray();
}

Predicatebuilder.cs

public static class PredicateBuilder
{
    public static Expression<Func<T, bool>> True<T>()
    {
        return f => true;
    }

    public static Expression<Func<T, bool>> False<T>()
    {
        return f => false;
    }

    public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
        Expression<Func<T, bool>> expr2)
    {
        var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
        return Expression.Lambda<Func<T, bool>>
            (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
    }

    public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
        Expression<Func<T, bool>> expr2)
    {
        var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
        return Expression.Lambda<Func<T, bool>>
            (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
    }
}   

述語ビルダーによるラムダ式の生成

public static class PredicateBuilderStore
{
    public static Func<BsonDocument, bool> GetPredicateForBsonDocument(Entity entity)
    {
        var predicate = PredicateBuilder.True<BsonDocument>();            
        predicate = predicate.And(d => d.GetElement({key}).Value == CompareWithValue);
        return predicate.Compile();
    }   
}

すべてのアイテムだけをクエリしたい場合は、次のように実行できます。

return this.collection.Find(_=>true).ToArray();
于 2018-07-27T17:27:22.007 に答える