草庐IT

c# - 帮助我理解 "LINQ to Entities only supports casting Entity Data Model primitive types"

coder 2024-06-02 原文

我有一个工作单元和一个使用 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/

有关c# - 帮助我理解 "LINQ to Entities only supports casting Entity Data Model primitive types"的更多相关文章

随机推荐