我一直在尋找到我的倉庫的規範模式,我用我的倉庫裏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