3

次のネストされたクエリを構築しようとしていますが、C# のエンティティで実行されますが、C# ドライバーを介して MongoDB クエリに適切に変換されます。

lpn = new List<PN> { new PN("/standard"), new PN("/my") };n
Collection.AsQueryable<T>
    (o => o.pns.Any(pf => lpn.Any(pn => pn.n == pf.n))

これは有効な C# です。値の配列と値の配列を一致させようとしていますが、ドライバー スタックでこのエラーが発生します。

Result Message: 
Test method MyLib.Tests.Models.ProjectTest.DBImportExcelProject threw exception: 
System.NotSupportedException: Unable to determine the serialization information for the expression: System.Collections.Generic.List`1[MyLib.DomainModels.lpn].
Result StackTrace:  
at MongoDB.Driver.Linq.Utils.BsonSerializationInfoFinder.GetSerializationInfo(Expression node, Dictionary`2 serializationInfoCache) in d:\vs11Projects\ThirdParty\mongo-csharp-driver\Driver\Linq\Utils\BsonSerializationInfoFinder.cs:line 64
   at MongoDB.Driver.Linq.Utils.BsonSerializationInfoHelper.GetSerializationInfo(Expression node) in d:\vs11Projects\ThirdParty\mongo-csharp-driver\Driver\Linq\Utils\BsonSerializationInfoHelper.cs:line 48
   at MongoDB.Driver.Linq.PredicateTranslator.BuildAnyQuery(MethodCallExpression methodCallExpression) in d:\vs11Projects\ThirdParty\mongo-csharp-driver\Driver\Linq\Translators\PredicateTranslator.cs:line 133
   at MongoDB.Driver.Linq.PredicateTranslator.BuildMethodCallQuery(MethodCallExpression methodCallExpression) in d:\vs11Projects\ThirdParty\mongo-csharp-driver\Driver\Linq\Translators\PredicateTranslator.cs:line 735
   at MongoDB.Driver.Linq.PredicateTranslator.BuildQuery(Expression expression) in d:\vs11Projects\ThirdParty\mongo-csharp-driver\Driver\Linq\Translators\PredicateTranslator.cs:line 73
...

$in:[]クエリを別のクエリに入れようとしているので、これはありがたいことです。

コレクション内のオブジェクトは次のようになります。

    {
            "_id" : ObjectId("50a5633292c3d22270ac2256"),
            "pns" : [
                    {
                            "n" : "/standard",
                            "ns" : {
                                    "v" : "standard"
                            }
                    }
            ]
    }

pns型の配列もそうなので、構造全体ではなくフィールドだけを一致させたくないので、PN単純に使用することはできません。私は他のさまざまな構造を試しました。Contains()PNn

これは、私がシェルで思いついた最も近いものです。

db.collection.find({
    "pns": {
        "$elemMatch": {
            "n": "/standard",
        }
    }
}).count();

しかし、それをLinq式に変換する方法さえ見つけられません。

質問lpn内 の任意の配列メンバーに一致するが、フィールドpnsに対してのみ一致する linq クエリを作成することは可能ですか? nまたは、これらのクエリを手動で作成する必要がありますか?

アップデート

ほぼ持っていると思います。クエリで適切なことを行う前に、文字列配列に変換する必要があると思いますが、Linq でそれを行うことはできないと思います。したがって、これは機能します。

var strArray = new[] { "/standard", "/my" };
Collection.AsQueryable<T>(o => o.pns.Any(pn => pn.n.In(strArray)));

それは私に与えます;

{
    "pns": {
        "$elemMatch": {
            "n": {
                "$in": [
                  "/standard",
                  "/my"
                ]
            }
        }
    }
}

残念ながら、ドライバーはこれを受け入れるほど賢くありません。

Collection.AsQueryable<T>(o => o.pns.Any(pn => pn.n.In(lpn.Select(pfn => pfn.n))));
4

1 に答える 1

3

Contains linq メソッドを使用する必要があります...

var strArray = new[] { "/standard", "/my" };
Collection.AsQueryable<T>(o => o.pns.Any(pn => strArray.Contains(pn.n)));

あなたのケースでは、 a でもこれを行うことができることに注意List<string>してください。実装するものはすべてIEnumerable<T>...

于 2012-11-15T23:28:41.543 に答える