メソッドに提供する動的ソートロジック(こちらを参照)を実装しました。Expression<Func<T, IComperable>>
OrderBy
今、EFが実際の型にIComperable
変換できないという問題があります。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<>
、 を実際の型として「実装」し、この型を の隣に保存して、リフレクションを介してFunc<>
呼び出すことです。OrderBy
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