मुझे @Mark पॉवेल का जवाब पसंद आया , लेकिन @ShuberFu ने कहा, यह त्रुटि देता है LINQ to Entities only supports casting EDM primitive or enumeration types
।
हटाने से var propAsObject = Expression.Convert(property, typeof(object));
उन गुणों के साथ काम नहीं किया गया जो मूल्य प्रकार थे, जैसे पूर्णांक, क्योंकि यह ऑब्जेक्ट के लिए int बॉक्स को स्पष्ट रूप से बॉक्स नहीं करेगा।
से उपयोग करना विचार Kristofer एंडरसन और मार्क Gravell मैं संपत्ति नाम का उपयोग Queryable समारोह का निर्माण और यह अभी भी इकाई की रूपरेखा के साथ काम करने के लिए एक रास्ता मिल गया। मैंने एक वैकल्पिक IComparer पैरामीटर भी शामिल किया है। सावधानी: IComparer पैरामीटर Entity फ्रेमवर्क के साथ काम नहीं करता है और Linq से Sql का उपयोग करते समय इसे छोड़ दिया जाना चाहिए।
निम्नलिखित इकाई फ्रेमवर्क और Linq Sql के साथ काम करता है:
query = query.OrderBy("ProductId");
और @Simon Scheurer भी यह काम करता है:
query = query.OrderBy("ProductCategory.CategoryId");
और अगर आप Sql में Entity Framework या Linq का उपयोग नहीं कर रहे हैं, तो यह काम करता है:
query = query.OrderBy("ProductCategory", comparer);
यहाँ कोड है:
public static class IQueryableExtensions
{
public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> query, string propertyName, IComparer<object> comparer = null)
{
return CallOrderedQueryable(query, "OrderBy", propertyName, comparer);
}
public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> query, string propertyName, IComparer<object> comparer = null)
{
return CallOrderedQueryable(query, "OrderByDescending", propertyName, comparer);
}
public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> query, string propertyName, IComparer<object> comparer = null)
{
return CallOrderedQueryable(query, "ThenBy", propertyName, comparer);
}
public static IOrderedQueryable<T> ThenByDescending<T>(this IOrderedQueryable<T> query, string propertyName, IComparer<object> comparer = null)
{
return CallOrderedQueryable(query, "ThenByDescending", propertyName, comparer);
}
public static IOrderedQueryable<T> CallOrderedQueryable<T>(this IQueryable<T> query, string methodName, string propertyName,
IComparer<object> comparer = null)
{
var param = Expression.Parameter(typeof(T), "x");
var body = propertyName.Split('.').Aggregate<string, Expression>(param, Expression.PropertyOrField);
return comparer != null
? (IOrderedQueryable<T>)query.Provider.CreateQuery(
Expression.Call(
typeof(Queryable),
methodName,
new[] { typeof(T), body.Type },
query.Expression,
Expression.Lambda(body, param),
Expression.Constant(comparer)
)
)
: (IOrderedQueryable<T>)query.Provider.CreateQuery(
Expression.Call(
typeof(Queryable),
methodName,
new[] { typeof(T), body.Type },
query.Expression,
Expression.Lambda(body, param)
)
);
}
}