0

C# と mongo を使用して、クエリのさまざまな方法をいくつか確認しています。現在、私は旅行のコレクションを持っており、各旅行には一連の費用があります。各費用には独自の objectId があります。

最初に、更新する特定のクエリを見つけるために、このクエリがありました。コツは、経費の ID にドットを挿入する 2 番目の部分でした。

var Update = Query.And(
   Query<Trip>.EQ(t => t.Id, ObjectId.Parse(tripId)), 
   Query<Expense>.EQ( "Expenses._id", ObjectId.Parse(id)));

ここでタイプミスをして Expenses._Id という名前を付けたので、大文字の II は「ゆるい文字列」から離れる方法を探していました。

私はこれを試しました

var tripToUpdate = Query.And(
    Query<Trip>.EQ(t => t.Id, ObjectId.Parse(tripId)), 
    Query<Expense>.EQ(e => e.Id, ObjectId.Parse(id)));

しかし、それはに翻訳されました

{ "$and" : [{ "_id" : ObjectId("5224f0208c74943810d333f6") }, 
            { "_id" : ObjectId("5224f0488c74943810d333f7") }] }

そして、期待されたものではありませんExpense._id。これをサポートするには、何らかの規則が必要になると思います。

男性がクエリするだけでなく、より強く型付けされた方法でそれを書くことはまったく可能ですか?

クエリのために、私はすでに std C# プロバイダーを使用しています。

4

2 に答える 2

0

@mnemosyn からの回答に基づいて、ダウンキャストを追加することでこのソリューションを改善しました。

素晴らしい入力の後、最初に ElemenMatch を使用することになりましたが、stackoverflow をさらに検索した後、ここで説明したように IQueryable から MongoQueryable へのダウンキャストを見つけました

Queryable<T> を変換して IMongoQuery に戻す

この後、コードは次のようになります。

var query =
        .Trips.AsQueryable()
        .Where(c => c.Id == ObjectId.Parse(tripId) && c.Expenses.Any(p => p.Id == ObjectId.Parse(id)));

MongoQuery へのダウンキャストが続く

var mongoQuery = ((MongoQueryable<Trip>) query).GetMongoQuery();

本当に素晴らしい作品。

于 2013-09-09T21:44:16.833 に答える