我有一个工作单元和一个使用 EF 4 和 POCO 的存储库。由于 EF 在可以 Skip() 和 Take() 之前需要一个有序集,因此我添加了以下单元测试(没有模拟)只是为了提取一条记录以查看它是否有效。
var myList = UOW.EntityRepo.Get( orderbyLambda: p => p.ID, page: 1, pageSize: 1);
这导致表达式 orderbyLambda = {p => Convert(p.ID)}和枚举期间的错误。 ID 是 tinyint (Int16/短)
那么为什么按ID排序失败呢?有关错误的更多信息
Unable to cast the type 'System.Int16' to type 'System.Object'.
我将 orderbyLambda 定义为 Expression<Func<E, object>> orderbyLambda
编辑:
真正的 killer 是如果我这样做:
orderbyLambda: p => new { p.ID }
它有效……为什么?
最佳答案
它发现“order by {object}”并 panic ;它知道如何通过 string 订购, int , short , DateTime , 等 - 但 object有点太模糊了。
您需要正确输入实际的 lambda;最简单的方法是制作 Get通用的,即
.... Get<TIdentity>(
Expression<Func<E, TIdentity>> orderbyLambda, int page, int pageSize)
然后:
orderbyLambda: p => p.ID
应该(无需更改调用方的代码)自动将其设为 Get<short>(...)在这种情况下,通过泛型类型推断。另一种选择是将其保留为 <E,object> ,但在接收端重写表达式树。更多工作。
关于c# - 帮助我理解 "LINQ to Entities only supports casting Entity Data Model primitive types",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4953946/