我有一个工作单元和一个使用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 / short)
那么为什么ID无法订购呢?有关错误的更多信息
Unable to cast the type 'System.Int16' to type 'System.Object'.
我将orderbyLambda定义为Expression<Func<E, object>> orderbyLambda
编辑:
如果我这样做,真正的杀手就是:
orderbyLambda: p => new { p.ID }
它有效......为什么?
答案 0 :(得分:15)
发现“{object}的命令”并恐慌;它知道如何按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>
。另一种选择是将其保留为{{1}},但在接收器处重写表达式树。更多的工作。