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

Zac*_*ott 10 c# entity-framework-4

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

var myList = UOW.EntityRepo.Get( orderbyLambda: p => p.ID, page: 1, pageSize: 1);
Run Code Online (Sandbox Code Playgroud)

这导致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

编辑:

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

 orderbyLambda:  p => new { p.ID }
Run Code Online (Sandbox Code Playgroud)

它有效...为什么?

Mar*_*ell 15

它正在发现"按{object}排序"并恐慌; 它知道如何订购string,int,short,DateTime,等-但object有点太含糊.

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

.... Get<TIdentity>(
         Expression<Func<E, TIdentity>> orderbyLambda, int page, int pageSize)
Run Code Online (Sandbox Code Playgroud)

然后:

orderbyLambda: p => p.ID
Run Code Online (Sandbox Code Playgroud)

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

  • 尝试将OrderBy作为我的存储库API的一部分,我遇到了类似的问题.LINQ to Entities对OrderBy犹豫不决(e => e.SomeCollection.Count).将表达式更改为OrderBy(e => new {e.SomeCollection.Count})也对我有用. (5认同)