मैं एक त्वरित कक्षा बनाने की कोशिश कर रहा हूं ताकि मैं ग्रिड के लिए लेखन सॉर्टिंग कोड बना सकूं और बनाए रख सकूं और कोड दोहराव रख सकूं। ऐसा करने के लिए मैं निम्नलिखित वर्ग के साथ आया था:मैं लिंक ऑर्डरबी के लिए उपयोग की जाने वाली अभिव्यक्तियों को गतिशील रूप से कैसे संग्रहीत कर सकता हूं?
public class SortConfig<TSource, TRelatedObject> where TSource : class where TRelatedObject : class
{
public IList<SortOption> Options { get; protected set; }
public SortOption DefaultOption { get; set; }
public SortConfig()
{
Options = new List<SortOption>();
}
public void Add(string name, Expression<Func<TSource, object>> sortExpression, TRelatedObject relatedObject, bool isDefault = false)
{
var option = new SortOption
{
FriendlyName = name,
SortExpression = sortExpression,
RelatedObject = relatedObject
};
Options.Add(option);
if (isDefault)
DefaultOption = option;
}
public SortOption GetSortOption(string sortName)
{
if (sortName.EndsWith("asc", StringComparison.OrdinalIgnoreCase))
sortName = sortName.Substring(0, sortName.LastIndexOf("asc", StringComparison.OrdinalIgnoreCase));
else if (sortName.EndsWith("desc", StringComparison.OrdinalIgnoreCase))
sortName = sortName.Substring(0, sortName.LastIndexOf("desc", StringComparison.OrdinalIgnoreCase));
sortName = sortName.Trim();
var option = Options.Where(x => x.FriendlyName.Trim().Equals(sortName, StringComparison.OrdinalIgnoreCase))
.FirstOrDefault();
if (option == null)
{
if (DefaultOption == null)
throw new InvalidOperationException(
string.Format("No configuration found for sort type of '{0}', and no default sort configuration exists", sortName));
option = DefaultOption;
}
return option;
}
public class SortOption
{
public string FriendlyName { get; set; }
public Expression<Func<TSource, object>> SortExpression { get; set; }
public TRelatedObject RelatedObject { get; set; }
}
}
विचार है कि आप अलग अलग तरह के विकल्प, क्या अभिव्यक्ति orderBy की एक त्वरित विन्यास बनाने के लिए प्रयोग किया जाता है, और वैकल्पिक रूप से एक उद्देश्य यह है कि कि से संबंधित है सॉर्ट विकल्प। यह मेरा कोड की तरह लग रहे करने के लिए अनुमति देता है:
protected void InitSortConfig()
{
_sortConfig = new SortConfig<xosPodOptimizedSearch, HtmlAnchor>();
_sortConfig.Add("name", (x => x.LastName), lnkSortName, true);
_sortConfig.Add("team", (x => x.SchoolName), lnkSortTeam);
_sortConfig.Add("rate", (x => x.XosRating), lnkSortRate);
_sortConfig.Add("pos", (x => x.ProjectedPositions), null);
_sortConfig.Add("height", (x => x.Height), lnkSortHeight);
_sortConfig.Add("weight", (x => x.Weight), lnkSortWeight);
_sortConfig.Add("city", (x => x.SchoolCity), lnkSortCity);
_sortConfig.Add("state", (x => x.SchoolState), lnkSortState);
}
और फिर मैं सिर्फ
// Get desired sorting configuration
InitSortConfig();
var sortOption = _sortConfig.GetSortOption(sort);
bool isDescendingSort = sort.EndsWith("desc", StringComparison.OrdinalIgnoreCase);
// Setup columns
InitSortLinks();
if (sortOption.RelatedObject != null)
{
// Make modifications to html anchor
}
// Form query
var query = PodDataContext.xosPodOptimizedSearches.AsQueryable();
if (isDescendingSort)
query = query.OrderByDescending(sortOption.SortExpression);
else
query = query.OrderBy(sortOption.SortExpression);
कर यह महान काम करता है जब क्रमबद्ध चर एक स्ट्रिंग है द्वारा सॉर्ट कर सकते हैं, लेकिन जब यह एक स्ट्रिंग मैं नहीं है निम्नलिखित अपवाद: Cannot order by type 'System.Object'.
मुझे लगता है कि ऐसा इसलिए है क्योंकि मैं अभिव्यक्ति को Expression<Func<TSource, object>>
के रूप में संग्रहीत कर रहा हूं और उस दूसरे जेनेरिक के बारे में अधिक विशिष्ट नहीं हूं। मुझे समझ में नहीं आता कि मैं एक वर्ग में अपने सभी अलग-अलग प्रकार के विकल्पों (यहां तक कि गैर-स्ट्रिंग गुणों के लिए भी) रख सकता हूं।
मैं मुद्दों में से एक लगता है कि Linq.OrderBy()
खंड Expression<Func<TSource, TKey>>
लेता है के रूप में यह पैरामीटर है है, लेकिन मैं चारों ओर कैसे Linq.OrderBy()
अनुमान लगाने के लिए क्या TKey
होना चाहिए में सक्षम है मेरे सिर लपेटकर नहीं कर रहा हूँ, और इसलिए मैं नहीं समझ सकता का लाभ लेने के लिए कैसे इन अभिव्यक्तियों को उचित TKey
के साथ स्टोर करने का अनुमान है।
कोई विचार?
[इस] पर एक नजर डालें (http://weblogs.asp.net/scottgu/archive/2008/01 /07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx) – Nestor
धन्यवाद, लेकिन मैं सॉर्टिंग निर्दिष्ट स्ट्रिंग के बजाय कोड-निर्दिष्ट होना चाहूंगा, खासकर जब से मेरी डेटा संरचना ग्रिड मेरे डेटाबेस के साथ 1: 1 डेटा मॉडल नहीं है, इसलिए सॉर्ट को ग्रिड-निर्दिष्ट से डीबी सॉर्ट में अनुवादित करने की आवश्यकता है, फिर भी – KallDrexx
क्या आप किसी भी प्रकार का सॉर्ट विकल्प प्राप्त करते समय जादू स्ट्रिंग का उपयोग नहीं कर रहे हैं? –