2012-04-21 4 views
9

Betrachten Sie den folgenden CodeÜbersetzen Abfragbare <T> zurück zu IMongoQuery

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

Die eigentliche Abfrage ist sehr komplex und Ich mag es nicht den Aufbau mit Querybuilder anstelle von LINQ.

Also ich möchte es zurück in IMongoQuery für die Verwendung in myCollection.Group() Aufruf, da es keine GroupBy Unterstützung durch LINQ gibt.

Ist es möglich?

Antwort

18

Edited Antwort:

Ich erkennen, dass es bereits ein offizieller Weg, um die Mongo Abfrage von einer LINQ-Abfrage zu bekommen (ich habe wissen müssen,!). Sie haben die IQueryable < T> zu einem MongoQueryable < T> niedergeschlagenen Zugriff auf die GetMongoQuery Methode zu erhalten:

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

Ursprüngliche Antwort:

Im Moment gibt es keine offiziell Weise zu tun, unterstützt In naher Zukunft wollen wir jedoch herausfinden, worauf MongoDB die LINQ-Abfrage abfragt.

Auf kurze Sicht die folgenden undokumentiert interne Methoden nutzen könnten, um herauszufinden, was MongoDB die LINQ-Abfrage Abfrage wird abgebildet:

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

Aber irgendwann Sie könnten von diesen nicht dokumentierte Methoden wechseln müssen offiziell unterstützte Methoden (die undokumentierten Methoden könnten sich in Zukunft ändern oder umbenannt werden).

+0

diese leider wegwirft alle orderby Anrufe in der ursprünglichen Linq-Anweisung. Sie müssen sie dann wieder Mongo-Stil anwenden. – Nashenas

0

Eine schnelle Erweiterung basiert auf Robert Stam Antwort:

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()); 
} 

Beispiel:

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); 
Verwandte Themen