EF4,Lambda,存储库模式和DTO

Jim*_*Jim 6 linq frameworks entity repository

我有一个关于Entity Framework4,Lambda表达式和数据传输对象(DTO)的半复杂问题.

所以我有一个小的EF4项目,并遵循既定的OO原则,我有一个DTO,在数据使用者(GUI)和数据模型之间提供一层抽象.

  • 具有getter/setter的VideoDTO = DTO,由GUI使用
  • VideoEntity = EF4生成的实体

我的问题围绕着GUI使用DTO(并没有让GUI完全使用Entity),并且需要将lambda传递给数据层.我的数据层是Add的基本存储库模式.更改,删除,获取,获取列表等.尝试使用如下签名实现Find方法:

public IEnumerable<VideoDTO> Find(Expression<Func<VideoEntity, bool>> exp)
...
_dataModel.Videos.Where(exp).ToList<Video>()
---
Run Code Online (Sandbox Code Playgroud)

我的问题/关注点是"exp"需要是VideoEntity而不是VideoDTO.我想保留关注点的分离,以便GUI不知道Entity对象.但是,如果我试图传入

Func<VideoDTO, bool> 
Run Code Online (Sandbox Code Playgroud)

然后我不能使用实际的数据模型在那个表达式上做LINQ.

有没有办法将a转换Func<VideoDTO,bool>为aFunc<VideoEntity, bool>

理想情况下,我的方法签名会接受Func<VideoDTO, bool>,这样GUI就不会引用底层数据实体.

这够清楚了吗?谢谢你的帮助


谢谢你们两个人的代表.

我将尝试在对象中定义搜索条件并在LINQ表达式中使用它.刚开始使用EF4和L2S,将其作为学习项目.

再次感谢!

man*_*aus 0

也许您的设计目标是防止数据模型实体传播到客户端层,而不是防止表示层和数据模型之间的依赖关系。如果以这种方式查看,那么按照您所说的方式形成查询就没有任何问题。

为了更进一步,您可以VideoEntity通过接口 ( IVideoEntityQueryFields) 公开可搜索字段,并将其用作表达式中的类型。

如果您不想向实体添加接口,那么更复杂的选择是使用VideoEntityQuery对象和将 an 转换Expression<Func<VideoEntityQuery,bool>>Expression<Func<VideoEntity,bool>>.