2011-03-28 39 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