【发布时间】:2010-09-08 10:59:07
【问题描述】:
我有一个关于 Entity Framework4、Lambda 表达式和数据传输对象 (DTO) 的半复杂问题。
所以我有一个小型 EF4 项目,并且遵循既定的 OO 原则,我有一个 DTO 来在数据消费者 (GUI) 和数据模型之间提供一个抽象层。
- VideoDTO = 带有 getter/setter 的 DTO,由 GUI 使用
- VideoEntity = EF4 生成的实体
我的问题围绕 GUI 对 DTO 的使用(并且根本不让 GUI 使用实体),以及需要将 lambda 传递给数据层。我的数据层是带有 Add 的基本存储库模式。更改、删除、获取、GetList 等 尝试使用如下签名实现 Find 方法:
public IEnumerable<VideoDTO> Find(Expression<Func<VideoEntity, bool>> exp)
...
_dataModel.Videos.Where(exp).ToList<Video>()
---
我的问题/担忧是“exp”需要是 VideoEntity 类型而不是 VideoDTO。我想保留关注点的分离,以便 GUI 不知道实体对象。但是如果我尝试传入
Func<VideoDTO, bool>
然后我无法使用实际数据模型对该表达式执行 LINQ Where。
有没有办法将Func<VideoDTO,bool> 转换为Func<VideoEntity, bool>
理想情况下,我的方法签名会接受Func<VideoDTO, bool>,这样GUI 就不会引用底层数据实体。
这足够清楚了吗?感谢您的帮助
感谢两位的回复。
我将尝试在对象中定义搜索条件并在 LINQ 表达式中使用它。刚开始使用 EF4 和 L2S,将其用作学习项目。
再次感谢!
【问题讨论】:
标签: linq frameworks repository entity