मैं @Mark Powell से जवाब पसंद आया, लेकिन जैसा कि @ShuberFu ने कहा, यह त्रुटि LINQ to Entities only supports casting EDM primitive or enumeration types
देता है।
var propAsObject = Expression.Convert(property, typeof(object));
को हटाकर उन गुणों के साथ काम नहीं किया जो मूल्य प्रकार थे, जैसे पूर्णांक, क्योंकि यह स्पष्ट रूप से ऑब्जेक्ट करने के लिए int को बॉक्स नहीं करेगा।
Kristofer Andersson और Marc Gravell से विचारों का उपयोग करके मुझे संपत्ति के नाम का उपयोग करके क्वेरी करने योग्य फ़ंक्शन बनाने का एक तरीका मिला और यह अभी भी इकाई फ्रेमवर्क के साथ काम करता है। मैंने एक वैकल्पिक आईसीओएमपेयर पैरामीटर भी शामिल किया। सावधानी: आईसीओएमपेयर पैरामीटर एंटिटी फ्रेमवर्क के साथ काम नहीं करता है और लिंक से एसक्यूएल का उपयोग करते समय बाहर छोड़ा जाना चाहिए।
Sql को इकाई की रूपरेखा और Linq के साथ निम्न काम करता है:
query = query.OrderBy("ProductId");
और @Simon Scheurer यह भी काम करता है:
query = query.OrderBy("ProductCategory.CategoryId");
और तुम Sql को इकाई की रूपरेखा या 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);
}
/// <summary>
/// Builds the Queryable functions using a TSource property name.
/// </summary>
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)
)
);
}
}
मुझे लगता है कि आप प्रतिबिंब का उपयोग करना चाहते हैं, और मुझे यकीन है कि आप एक लैम्ब्डा अभिव्यक्ति में प्रतिबिंब का उपयोग कर सकते है जब एक सूची के खिलाफ LINQ का उपयोग नहीं कर रहा हूँ ... अच्छी तरह से, Linq में एसक्यूएल करने के लिए लगभग निश्चित रूप से नहीं लेकिन शायद या कुछ और। – CodeRedick
@ टेलोस: कोई कारण नहीं है कि आप लैम्ब्डा में प्रतिबिंब (या कोई अन्य एपीआई) का उपयोग नहीं कर सकते हैं। यदि कोड अभिव्यक्ति के रूप में मूल्यांकन किया जाता है और किसी अन्य चीज़ में अनुवाद किया जाता है (जैसे LINQ-to-SQL, जैसा कि आप सुझाव देते हैं) पूरी तरह से एक और सवाल है, तो यह काम करेगा या नहीं। –
यही कारण है कि मैंने एक उत्तर के बजाय एक टिप्पणी पोस्ट की। ;) ज्यादातर Linq2SQL के लिए उपयोग किया जाता है ... – CodeRedick