আমি @ মার্ক পাওয়েল থেকে উত্তরটি পছন্দ করেছি , তবে @ শুবারফু যেমন বলেছিলেন, এটি ত্রুটি দেয় LINQ to Entities only supports casting EDM primitive or enumeration types
।
অপসারণ var propAsObject = Expression.Convert(property, typeof(object));
যেমন মান সংখ্যার মতো ধরণের বৈশিষ্ট্যগুলির সাথে কাজ করে না, কারণ এটি বস্তুর সাথে অন্তর্নিহিতভাবে বাক্স না দেয় n't
ক্রিস্টোফার অ্যান্ডারসন এবং মার্ক গ্র্যাভেলের আইডিয়াস ব্যবহার করে আমি সম্পত্তিটির নাম ব্যবহার করে ক্যোয়ারিয়েল ফাংশনটি তৈরির একটি উপায় খুঁজে পেয়েছি এবং এটি এখনও সত্তা ফ্রেমওয়ার্কের সাথে কাজ করে চলেছে। আমি একটি alচ্ছিক আইকম্পেরার প্যারামিটারও অন্তর্ভুক্ত করেছি। সতর্কতা: আইসিকম্পারার প্যারামিটার সত্তা ফ্রেমওয়ার্কের সাথে কাজ করে না এবং লিনক থেকে স্ক্যুয়াল ব্যবহার করে ছেড়ে দেওয়া উচিত।
অ্যান্টিটি ফ্রেমওয়ার্ক এবং লিনক থেকে এসকিএল এর সাথে নিম্নলিখিতগুলি কাজ করে:
query = query.OrderBy("ProductId");
এবং @ সিমন শিউচার এটিও কাজ করে:
query = query.OrderBy("ProductCategory.CategoryId");
এবং যদি আপনি সিকিএল থেকে সত্তা ফ্রেমওয়ার্ক বা লিনক ব্যবহার না করেন তবে এটি কাজ করে:
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)
)
);
}
}