我一直在寻找到我的仓库的规范模式,我用我的仓库里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);
}
的设置只是有快速创建在VS作为一个例子,并没有从EF4拍摄。我试图在只有一种类型的情况下,在同一规范中查询超过1个对象集的想法。 – 2011-03-28 09:50:46
因此,您必须具有导航属性。如果你想建立的查询,这将在不相关的实体工作则必须揭露'IQueryable'直接或建立一些复杂的API来定义查询,将在您的查找方法转化为表达式。这是很多工作要做,不值得。 – 2011-03-28 09:59:04