我很难让这个背后的设计正确。我正在使用存储库模式来管理我的数据层。在我的一个控制器(MVC3)中,我正在构建一个需要执行连接的 LINQ 查询。我对此有两个问题:
- 向我的存储库添加一个方法来执行所有连接、投影等更好吗?我对此有点犹豫,因为这会导致我的存储库上的合同定义不断增长?
- 假设我在返回所有项目的 Post 存储库中有一个 List() 方法。我目前无法在 linq (join) 查询中使用此方法,因为它无法将其转换为存储表达式。请注意,下面的代码使用了一个名为 repo 的类,它使用相同的上下文实例保存对我所有存储库(帖子、朋友)的引用。
大编辑: 现在对我来说事情有点清楚了,但我希望有人会跳到这里来帮助我把一切整理好;-)。我要做的是实现一个规范模式以及我的存储库模式。问题是,我正在使用 POCO,而我的存储库正在使用使用 IObjectSets 的 IContext 接口。因此,在下面的列表方法中,Posts 是一个 IObjectSet,Context 是一个 IContext 接口,我将实际上下文注入其中。
我一直在阅读并且有一些非常好的即用型代码,例如 implementation-repository-pattern-with-ef4-poco-support和implementation-repository-pattern-with-entity-framework。
这两个示例都使用存储库中的 objectContext。把它抽象出来不是更好吗?
我的存储库:
public System.Linq.IQueryable<Post> List()
{
return this.context.Posts;
}
在我的控制器方法中:
var friendquestions = (from q in base._repo.Post.List().OfType<Question>()
from f in _repo.Friends.List()
where f.userId == myid
where q.Author == f.friendId
select q.Id).ToArray();
但是,以下确实有效(为什么?):
var temp = (from q in base._repo.Post.List().OfType<Question>()
where q.Id > 6
select q.Id).ToArray();
它与此处描述的问题基本相同:linq-to-entities-does-not-recognize-the-method
我该如何围绕这个设计?我一直在阅读模型定义的函数,但我不确定这是否可行?
提前致谢