2012-04-21 5 views
9

वापस करने के लिए विचार करें निम्नलिखित कोडअनुवाद Queryable <T> IMongoQuery

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

वास्तविक क्वेरी बहुत जटिल है और मैं LINQ के बजाय QueryBuilder का उपयोग कर इसे निर्माण पसंद नहीं है।

तो मैं इसे MyCollection.Group() कॉल में उपयोग करने के लिए IMongoQuery पर परिवर्तित करना चाहता हूं क्योंकि LINQ के माध्यम से कोई समूह समर्थन नहीं है।

क्या यह संभव है?

उत्तर

18

संपादित जवाब:

मुझे एहसास हुआ कि वहाँ पहले से ही एक LINQ क्वेरी से मोंगो क्वेरी प्राप्त करने के लिए एक अधिकारी तरीका है कि (मैं पता होना चाहिए!)।

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

मूल जवाब:: आप एक MongoQueryable < टी> के लिए IQueryable < टी खिन्न करने के लिए> GetMongoQuery विधि तक पहुँच प्राप्त करने के लिए है इस समय

आधिकारिक तौर पर समर्थित नहीं वहाँ जाता है कि ऐसा करने के लिए जिस तरह से , लेकिन निकट भविष्य में हम यह जानना चाहते हैं कि मोंगोडीबी क्वेरी LINQ क्वेरी को मैप किया गया था।

अल्पावधि आप निम्नलिखित अप्रलेखित आंतरिक तरीकों का उपयोग कर सकता है पता लगाने के लिए क्या MongoDB LINQ क्वेरी क्वेरी में करने के लिए मैप किया गया है:

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

लेकिन कुछ बिंदु पर आप के लिए इन गैर-दस्तावेजी तरीकों से स्विच करने की आवश्यकता हो सकती है आधिकारिक रूप से समर्थित तरीकों (अनियंत्रित विधियां भविष्य में बदल सकती हैं या उनका नाम बदला जा सकता है)।

+0

यह उदासी दूर मूल LINQ बयान में सभी orderby कॉल फेंकता है। आपको उन्हें वापस मोंगो शैली लागू करना होगा। – Nashenas

0

एक त्वरित रॉबर्ट स्टैम के उत्तर के आधार पर विस्तार:

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); 
संबंधित मुद्दे