9

次のコードを検討してください

var q = from e in myCollection.AsQueryable<Entity>() where e.Name == "test" select e;

実際のクエリは非常に複雑で、LINQ の代わりに QueryBuilder を使用して構築するのは好きではありません。

したがって、LINQ による GroupBy のサポートがないため、myCollection.Group() 呼び出しで使用するために IMongoQuery に変換したいと考えています。

出来ますか?

4

2 に答える 2

18

編集された回答:

LINQ クエリから Mongo クエリを取得する公式の方法が既にあることに気付きました (知っておくべきでした!)。GetMongoQuery メソッドにアクセスするには、IQueryable<T> を MongoQueryable<T> にダウンキャストする必要があります。

var linqQuery = from e in collection.AsQueryable<Entity>() where e.Name == "test" select e;
var mongoQuery = ((MongoQueryable<Entity>)linqQuery).GetMongoQuery();

元の答え:

現時点では、公式にサポートされている方法はありませんが、近い将来、LINQ クエリがどの MongoDB クエリにマップされたかを簡単に見つけられるようにする予定です。

短期的には、次の文書化されていない内部メソッドを使用して、LINQ クエリがマップされている MongoDB クエリを見つけることができます。

var linqQuery = from e in collection.AsQueryable<Entity>() where e.Name == "test" select e;
var translatedQuery = (SelectQuery)MongoQueryTranslator.Translate(linqQuery);
var mongoQuery = translatedQuery.BuildQuery();

ただし、ある時点で、これらの文書化されていないメソッドから公式にサポートされているメソッドに切り替える必要がある場合があります (文書化されていないメソッドは、将来変更されるか、名前が変更される可能性があります)。

于 2012-04-22T16:01:15.183 に答える
1

Robert Stamの回答に基づく簡単な拡張:

public static IMongoQuery ToMongoQuery<T>(this IQueryable<T> linqQuery)
{
    var mongoQuery = ((MongoQueryable<T>)linqQuery).GetMongoQuery();
    return mongoQuery;
}
public static WriteConcernResult Delete<T>(this MongoCollection<T> col,   IQueryable<T> linqQuery)
{
     return col.Remove(linqQuery.ToMongoQuery());
}
public static WriteConcernResult Delete<T>(this MongoCollection<T> col, Expression<System.Func<T, bool>> predicate)
{
    return col.Remove(col.AsQueryable<T>().Where(predicate).ToMongoQuery());
}

例:

myCollection.Remove(myCollection.AsQueryable().Where(x => x.Id == id).ToMongoQuery());
myCollection.Delete(myCollection.AsQueryable().Where(x => x.Id == id));
myCollection.Delete(x => x.Id == id);
于 2016-11-13T07:22:52.037 に答える