का समर्थन करने का समर्थन करती हैं मैंने ऑर्डरबी क्लॉज के लिए अभिव्यक्ति को पारित करने की अनुमति देने के लिए एक विधि लिखी है, लेकिन मैं इस समस्या में भाग गया।इकाई फ्रेमवर्क: LINQ से इकाइयां केवल कास्टिंग एंटीटी डेटा मॉडल आदिम प्रकार
प्रकार 'System.DateTime' टाइप करने के लिए 'System.IComparable' कास्ट करने में असमर्थ। LINQ से इकाइयों केवल कास्टिंग इकाई डेटा मॉडल आदिम प्रकार का समर्थन करता है।
मूल रूप से अभिव्यक्ति यह है:
Expression<Func<K, IComparable>> orderBy
और इस तरह प्रयोग किया जाता है:
SomeEntities.SomeTable
.Where
(
whereClause
)
.Select
(
selectClause
)
.OrderBy(orderBy)
विचार है, ताकि मैं एक शब्दकोश का उपयोग कर सकते स्ट्रिंग की तरह भाव मैचों धारण करने के लिए:
_possibleSortForForumItem.Add("CreateDate", item => item.CreateDate);
तो मैं एक विधि है कि लगता है सॉर्ट स्ट्रिंग में और अभिव्यक्ति देता है अगर यह शब्दकोश में एक कुंजी से मेल खाता है, अगर कुछ डिफ़ॉल्ट नहीं देता है। (विचार यह नियंत्रित करने का एक तरीका है कि इसे किस क्रम में आदेश दिया जा सकता है) अब यह स्ट्रिंग गुणों के लिए काम करता है, लेकिन अब तक डेटाटाइम या पूर्णांक के लिए नहीं है क्योंकि मुझे उपरोक्त त्रुटि संदेश मिलता है।
अब तक जब तक मैं समस्या को समझता हूं, यह है कि इकाई फ्रेमवर्क को प्राथमिक/ईडीएम प्रकार होने की आवश्यकता होती है क्योंकि इसे सी # डेटटाइम को डेटाबेस को संभालने में कुछ बदलना पड़ता है।
क्या डेटाटाइम को एक आदिम प्रकार में बदलने का कोई तरीका है ताकि यह अभी भी काम करेगा?
समाधान
विधि द्वारा आदेश प्राप्त करने के लिए विधि: (एक प्रश्न में ले लो और "का आदेश दिया रूप" में इसे वापस)
private static Func<IQueryable<ForumViewItem>, IOrderedQueryable<ForumViewItem>> GetMethodForSort(String sortBy)
{
if (_methodForSort == null)
{
_methodForSort = new Dictionary<String, Func<IQueryable<ForumViewItem>, IOrderedQueryable<ForumViewItem>>>();
_methodForSort.Add(SortForumViewItemCreatedOn, item => item.OrderBy(innerItem => innerItem.CreatedOn));
...
}
Func<IQueryable<ForumViewItem>, IOrderedQueryable<ForumViewItem>> orderMethod;
if(String.IsNullOrEmpty(sortBy) || !_methodForSort.ContainsKey(sortBy))
{
orderMethod = _methodForSort["ForumName"];
}
else
{
orderMethod = _methodForSort[sortBy];
}
return orderMethod;
}
व्यापक क्वेरी विधि हस्ताक्षर विधि:
IList<K> GetListForGrid<T, K>(this ObjectQuery<T> query, ... Func<IQueryable<K>, IOrderedQueryable<K>> orderBy, ...)
और विधि में पारित के उपयोग:
+०१२३५१६४१०६१initialQuery = query
.Where
(
somethingEqualsSomething
)
.Select
(
selectClause
);
var orderedQuery = orderBy(initialQuery);
returnValue = orderedQuery
.Skip(numberToShow * realPage)
.Take(numberToShow)
.ToList();
मैं Func के परिणामस्वरूप IOrderedQueryable का सुझाव दूंगा, यह संकलन समय पर लागू होगा ऑर्डरबी का उपयोग किया जाता है, क्योंकि उदाहरण के लिए पेजिंग को ऑर्डर किए गए प्रश्न पसंद नहीं हैं। –
डेवी, सहमत। मैंने इसे प्रतिबिंबित करने के लिए कोड बदल दिया। –
मुझे यह जानने के लिए कुछ मिनट लग गए कि अंत में यह कैसे कामयाब है, लेकिन अंत में यह बहुत ही व्यावहारिक है। –