2011-03-28 133 views
0

我一直在寻找到我的仓库的规范模式,我用我的仓库里EF4来查询数据库,并通过将在表达式中,像这样的选择的实体映射: -EF关系和规范模式

public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate) 
{ 
    return _objectSet.Where<TEntity>(predicate); 
} 

这如果只是设置一个对象工作,但说,如果你想选择的是大于128个字符,并且用户是活跃用户提出的所有意见工作好。当使用两个或多个对象集时,您将如何创建一个规范?

例子: -

class User 
{ 
    public string Name { get; set; } 
    public bool Active { get; set; } 
    public virtual ICollection<Post> Posts { get; set; } 

    public User() 
    { 
     Posts = new List<Post>(); 
    } 
} 

class Post 
{ 
    public string Text { get; set; } 
    public DateTime Created { get; set; } 
    public virtual ICollection<Comment> Comments { get; set; } 

    public Post() 
    { 
     Comments = new List<Comment>(); 
    } 
} 

class Comment 
{ 
    public string Text { get; set; } 
    public DateTime Created { get; set; } 
} 

要Linq中做到这一点: -

var results = from u in users 
       from p in u.Posts 
       from c in p.Comments 
       where u.Active && c.Text.Length > 128 
       select c; 

你会如何然后再转换到规范类?也许我只是没有看到的东西,因为它似乎是一个合理的事情:)

编辑

规格接口:

public interface ISpecification<TEntity> 
{ 
    bool IsSatisfiedBy(TEntity entity); 
} 

回答

1

第一当前所有的设置不允许这样的查询,因为UserComment不相关。您只能选择与用户相关的帖子相关的所有评论,但您不知道是谁发布了评论。

只是UserComment之间添加关系,你可以简单地使用:

var results = from c in context.Comments 
       where c.User.Active and c.Text.Length > 128 
       select c; 

这将是很容易可以在你的规范模式。无论如何,如果你想建立从Comment复杂条件在Find方法,你必须公开的导航性能,以允许。

+0

的设置只是有快速创建在VS作为一个例子,并没有从EF4拍摄。我试图在只有一种类型的情况下,在同一规范中查询超过1个对象集的想法。 – 2011-03-28 09:50:46

+0

因此,您必须具有导航属性。如果你想建立的查询,这将在不相关的实体工作则必须揭露'IQueryable'直接或建立一些复杂的API来定义查询,将在您的查找方法转化为表达式。这是很多工作要做,不值得。 – 2011-03-28 09:59:04

0

滑稽我只是读有关OCP(开放关闭原则)和规范模式,我想知道是否真的值得在我的项目中实现规范模式。我只是担心我可能会因为我有几个实体并且通过多个标准进行查询这一事实而导致大量规范。

不管怎么说,这是关于你正在使用(这我使用的为好)模式我喜欢的博客文章之一(实际上是两个):

Entity Framework 4 POCO, Repository and Specification Pattern

Specification Pattern In Entity Framework 4 Revisited

+0

该多好啊我已经看过他们的网站之一,但他们只能查询一个类型的对象集,我想查询多个。 – 2011-03-28 09:45:31