私が見ることができることから、個別のプロファイリングを mongo に送信する必要があります。以下は、テスト DB に対する個別のクエリの 2 つのトレースです。
{
"op" : "command",
"ns" : "test.$cmd",
"command" : {
"distinct" : "testing",
"key" : "Value"
},
"ntoreturn" : 1,
"keyUpdates" : 0,
"numYield" : 0,
"lockStats" : {
"timeLockedMicros" : {
"r" : NumberLong(49),
"w" : NumberLong(0)
},
"timeAcquiringMicros" : {
"r" : NumberLong(2),
"w" : NumberLong(1)
}
},
"responseLength" : 209,
"millis" : 0,
"ts" : ISODate("2013-06-12T23:53:29.872Z"),
"client" : "127.0.0.1",
"allUsers" : [ ],
"user" : ""
}
{
"op" : "command",
"ns" : "test.$cmd",
"command" : {
"distinct" : "testing",
"key" : "Value",
"query" : {
}
},
"ntoreturn" : 1,
"keyUpdates" : 0,
"numYield" : 0,
"lockStats" : {
"timeLockedMicros" : {
"r" : NumberLong(113),
"w" : NumberLong(0)
},
"timeAcquiringMicros" : {
"r" : NumberLong(4),
"w" : NumberLong(3)
}
},
"responseLength" : 209,
"millis" : 0,
"ts" : ISODate("2013-06-12T23:53:51.730Z"),
"client" : "127.0.0.1",
"allUsers" : [ ],
"user" : ""
}
最初のクエリは、C# から linq プロバイダー経由で送信されます。
mongoAdapter.Collection<TestClass>().AsQueryable().Select(s => s.Value).Distinct().ToList();
2 つ目は、コマンド ラインで実行される個別です。
db.testing.distinct('Value')
両方のプロファイリング レコードは、コマンド セクション内に個別のものを示しています。唯一の違いは、2 番目のレコードにもクエリ演算子が表示されることですが、これは空であるため、実際の個別のクエリに影響を与えることはありません。
したがって、私の簡単な答えは、Linq の個別の操作は、シェルと同じクエリを実行する必要があると考えているということです。
アップデート
linq クエリを Mongo に渡すには、コレクションがクエリ可能になっていることを確認する必要があります。
したがって、クエリを更新する場合
collection.Find(query).AsQueryable().Select(x =>x.SequencingId) .Distinct();
に
collection.AsQueryable().Where({you query here}).Select(x =>x.SequencingId) .Distinct();
問題は、コレクションに対して Find を実行しているためです。レコードが mongo クエリの一部としてではなく Enumerable として返されたら、実際にはメモリ内で個別を実行しているためです。