我实现了提供给该方法的动态排序逻辑(请参见此处) 。Expression<Func<T, IComperable>>
OrderBy
现在我遇到了问题,EF 无法将IComperable
in转换Func<T, IComperable>
为其实际类型:
无法将类型“System.Int32”转换为类型“System.IComparable”。LINQ to Entities 仅支持转换 EDM 基元或枚举类型。
在
System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.ValidateAndAdjustCastTypes(TypeUsage toType,TypeUsage fromType,Type toClrType,Type fromClrType)
有没有办法解决这个问题?
我目前发现的唯一方法是将Func<>
's 作为它们的真实类型“实现”,将此类型保存在旁边Func<>
并调用OrderBy
via 反射:
public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, Type orderType, object expression)
{
return typeof(Queryable).GetMethods().First(m => m.Name == "OrderBy")
.MakeGenericMethod(typeof(T), orderType)
.Invoke(null, new object[] { source, expression }) as IQueryable<T>
}
但这对我来说似乎很丑陋(而且很慢?),并且不像当前的(遗憾的是仅适用于 LINQ to objects 工作)解决方案那样好用......
更新:
这个问题似乎只在返回int
或bool
在时发生Func<T, IComperable>
,因为它适用于string
...