2012-06-25 3 views
6

मैं रावेनडीबी के साथ खेल रहा हूं और सोच रहा हूं कि मुझे कुछ स्पष्ट याद आ रहा है या नहीं।फेंक <T, bool> के रूप में ravendb क्वेरी पास नहीं करता

var name = "test"; 
    posts = RavenSession.Query<Post>() 
     .Where(x => x.Tags.Any(y => y == name)) 
     .OrderByDescending(x => x.CreatedAt) 
     .Take(5); 

ठीक काम करता है, अगर मैं समकक्ष (IMO) लिख रहा हूँ Func<T, bool> का उपयोग कर, यह दुर्घटना नहीं है, लेकिन क्वेरी जहां याद आ रही है:

बात यह है कि अगर मैं इस तरह क्वेरी गुजर रहा हूँ, है हालत:

क्वेरी = शुरू = 0:

var name = "test";  
Func<Post, bool> selector = x => x.Tags.Any(y => y == name); 
posts = RavenSession.Query<Post>() 
     .Where(x => selector(x)) 
     .OrderByDescending(x => x.CreatedAt) 
     .Take(5); 

प्रोफाइलर इसे पसंद आउटपुटpageSize = 5 एकत्रीकरण = कोई नहीं प्रकार = -CreatedAt

अद्यतन: यह काम करता है अगर मैं समारोह के बजाय अभिव्यक्ति का उपयोग कर रहा है, इसलिए मैं हो सकता है मैं कुछ समारोह और Linq के बारे में गलत याद सोचा, इसलिए लिखा था एक साधारण परीक्षण:

var range = Enumerable.Range(1, 50); 

Func<int, bool> selector = x => x == 42; 
var filtered = range.Where(x => selector(x)); 

तो अब यह केवल सवाल है कि क्यों रावेन डीबी क्वेरी बिल्डर अलग-अलग काम करता है।

उत्तर

9

का उपयोग कर एक Expression ऐसा करें:

Expression<Func<Post, bool>> selector = x => x.Tags.Any(y => y == name); 

और Where(selector) करने के लिए Where(x => selector(x)) बदल जाते हैं।

एक Expression आवश्यक है क्योंकि RavenDb इससे अभिव्यक्ति वृक्ष बना सकता है, जो तर्क को डेटाबेस क्वेरी में अनुवाद करने की अनुमति देता है। यह Func<Post, bool> से एक अभिव्यक्ति वृक्ष नहीं बना सकता है, इसलिए यह या तो इसे अनदेखा कर सकता है, एक निष्पादन फेंक सकता है या जो भी RavenDb के निर्माता निर्दिष्ट करता है।

+0

मैंने प्रश्न अपडेट किया है, यह अभिव्यक्ति के साथ काम करता है। – Giedrius

+0

@Giedrius I ने मेरे उत्तर में एक संक्षिप्त स्पष्टीकरण जोड़ा। – Botz3000

3

अपने अद्यतन के लिए एक प्रतिक्रिया के रूप में, वहाँ महत्वपूर्ण व्यवहार IQueryable<> पर IEnumerable<> और Expression<Func<>> पर Func<> के बीच मतभेद है कि वाक्य रचना समान लग रही है। यह सिर्फ रावेन नहीं है, लेकिन IQueryable<> स्रोत जैसे कि LINQ से SQL या Entity Framework।

संबंधित मुद्दे