帮助我理解“LINQ to Entities仅支持转换实体数据模型基元类型”

我有一个工作单元和一个使用EF 4和POCO的存储库。 由于EF在Skip()和Take()之前需要一个有序集,我添加了以下unit testing(没有模拟)只是为了拉出一条记录来查看它是否有效。

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> orderbyLambda

编辑:

如果我这样做,真正的杀手是:

  orderbyLambda: p => new { p.ID } 

它有效…为什么?

它正在发现“按{object}排序”并恐慌; 它知道如何通过stringintshortDateTime等进行排序 – 但是object有点过于模糊。

你需要正确输入实际的lambda; 最简单的方法是使得通用,即

 .... Get( Expression> orderbyLambda, int page, int pageSize) 

然后:

 orderbyLambda: p => p.ID 

应该(在没有你更改调用者的代码的情况下)通过generics类型推断在这种情况下自动使其成为Get(...) 。 另一种选择是将其保留为 ,但在接收器处重写表达式树。 更多的工作。