में ऑर्डरबी की उपस्थिति की जांच कैसे करें मैं LINQ से Entities इकाइयों के लिए भंडार उत्पन्न करने के लिए T4 का उपयोग कर रहा हूं।ऑब्जेक्टिव <T> अभिव्यक्ति वृक्ष
भंडार में (अन्य चीजों के साथ) पेजिंग के लिए उपयुक्त एक सूची विधि शामिल है। Supported and Unsupported Methods के लिए प्रलेखन इसका उल्लेख नहीं करता है, लेकिन आप Skip
को एक अज्ञात IQueryable
पर "कॉल" नहीं कर सकते हैं। यह निम्न अपवाद बढ़ा देंगे:
System.NotSupportedException: विधि 'छोड़ें' केवल संस्थाओं के लिए LINQ में अनुसार क्रमबद्ध इनपुट के लिए समर्थित है। विधि 'OrderBy' विधि से पहले बुलाया जाना चाहिए 'छोड़ें' ..
मैं एक डिफ़ॉल्ट एक आंशिक विधि के माध्यम से छँटाई परिभाषित करने की अनुमति देकर इसे हल। लेकिन मुझे समस्याएं आ रही हैं कि क्या अभिव्यक्ति वृक्ष में वास्तव में OrderBy
है।
मैं संभव के रूप में करने के लिए समस्या कम कर दिया है कम कोड के रूप में:
public partial class Repository
{
partial void ProvideDefaultSorting(ref IQueryable<Category> currentQuery);
public IQueryable<Category> List(int startIndex, int count)
{
IQueryable<Category> query = List();
ProvideDefaultSorting(ref query);
if (!IsSorted(query))
{
query = query.OrderBy(c => c.CategoryID);
}
return query.Skip(startIndex).Take(count);
}
public IQueryable<Category> List(string sortExpression, int startIndex, int count)
{
return List(sortExpression).Skip(startIndex).Take(count);
}
public IQueryable<Category> List(string sortExpression)
{
return AddSortingToTheExpressionTree(List(), sortExpression);
}
public IQueryable<Category> List()
{
NorthwindEntities ent = new NorthwindEntities();
return ent.Categories;
}
private Boolean IsSorted(IQueryable<Category> query)
{
return query is IOrderedQueryable<Category>;
}
}
public partial class Repository
{
partial void ProvideDefaultSorting(ref IQueryable<Category> currentQuery)
{
currentQuery = currentQuery.Where(c => c.CategoryName.Contains(" ")); // no sorting..
}
}
यह मेरा वास्तविक कार्यान्वयन नहीं है!
लेकिन मेरा प्रश्न है, मैं IsSorted
विधि को कैसे कार्यान्वित कर सकता हूं? समस्या यह है कि LINQ से Entities क्वेरी हमेशा ObjectQuery
प्रकार के होते हैं, जो IOrderedQueryable
लागू करता है।
तो मुझे यह सुनिश्चित करना चाहिए कि अभिव्यक्ति वृक्ष में OrderBy
विधि मौजूद है? पेड़ को पार्स करने का एकमात्र विकल्प क्या है?
अद्यतन
मैं स्पष्ट करना है कि यह कैसे भंडार करने के लिए छँटाई समर्थन जोड़ने, लेकिन इसकी जांच करने का करने के लिए करता है, तो ProvideDefaultSorting
आंशिक विधि वास्तव में अभिव्यक्ति पेड़ के लिए एक OrderBy
जोड़ा गया है के बारे में नहीं है दो अन्य भार के जोड़ दिया है ।
समस्या यह है कि पहली आंशिक कक्षा एक टेम्पलेट द्वारा उत्पन्न होती है और आंशिक वर्ग के दूसरे भाग के कार्यान्वयन को किसी अन्य समय टीम के सदस्य द्वारा बनाया जाता है। आप .NET Entity Framework को EntityContext जेनरेट करने के तरीके से इसकी तुलना कर सकते हैं, यह अन्य डेवलपर्स के लिए एक्सटेंशन पॉइंट की अनुमति देता है। तो मैं ProvideDefaultSorting
सही ढंग से लागू नहीं होने पर इसे मजबूत बनाने की कोशिश करना चाहता हूं और क्रैश नहीं करना चाहता हूं।
तो शायद सवाल अधिक है, मैं कैसे पुष्टि कर सकता हूं कि ProvideDefaultSorting
वास्तव में अभिव्यक्ति वृक्ष में सॉर्टिंग जोड़ता था।
अद्यतन 2
नए सवाल का जवाब दे रहा था, और स्वीकार किए जाते हैं, मुझे लगता है कि मैं और अधिक प्रश्न मिलान करने के लिए शीर्षक बदलना चाहिए। या क्या मुझे वर्तमान शीर्षक छोड़ना चाहिए क्योंकि इससे लोगों को इस समाधान के लिए एक ही समस्या का सामना करना पड़ेगा?
आपको यह जवाब देखना चाहिए http://stackoverflow.com/questions/36923850/how-to-know-if-orderby-was-applied-to-query – yosbel