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

时间:2011-02-10 06:12:35

标签: c# entity-framework-4

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

它有效......为什么?

1 个答案:

答案 0 :(得分:15)

发现“{object}的命令”并恐慌;它知道如何按stringintshortDateTime等订购 - 但object有点过于模糊。

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

.... Get<TIdentity>(
         Expression<Func<E, TIdentity>> orderbyLambda, int page, int pageSize)

然后:

orderbyLambda: p => p.ID

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