2011-02-10 25 views
10

我有一个工作单元和一个使用EF 4和POCO的存储库。由于EF在可以跳过()和Take()之前需要一个有序集合,因此我添加了下面的单元测试(没有模拟),只是为了找出一个记录来查看它是否工作。帮助我理解“LINQ to Entities只支持铸造实体数据模型原语类型”

var myList = UOW.EntityRepo.Get(orderbyLambda: p => p.ID, page: 1, pageSize: 1); 

这会导致表达式为orderbyLambda = {p => Convert(p.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 } 

它的工作原理...为什么?

回答

15

这是发现“由{对象}秩序和恐慌;它知道如何通过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>,但在接收器处重写表达式树。更多的工作。

+3

orderbyLambda:p =>新{p.ID}工作......非常有趣...... – 2011-02-10 06:29:14

相关问题