2009-09-29 100 views
2

我使用邏輯刪除我的系統,並希望有自動過濾數據庫所做的每個呼叫時由一個DataContext做每個呼叫。篩選使用LINQ實體

讓我們說,我是從數據庫通過以下方式加載數據:

product.Regions 

我怎麼能濾波器,因爲Regions的每個請求是EntitySet<Region>,而不是一個自定義的方法,因此不會允許我補充isDeleted = 0

到目前爲止,我發現AssociateWith但我討厭不得不寫一行代碼爲每個表 - >當前項目的協會...

我期待到EI建立通用的lambda表達式或..別的東西?

+0

我希望你能找到答案。我不記得我多久寫一次「.Where(i => i.IsVisible)」:p – JustLoren 2009-09-29 17:59:18

+1

儘管這可能根本沒有幫助 - 在NHibernate中這樣做很簡單,使用過濾器或映射中的條件... – Rashack 2009-10-02 07:38:55

+0

+1對於你來說,提醒我LINQ to SQL不僅僅是OR/M,而且有時解決方案不是那麼容易獲得的;) – Mathlec 2009-10-02 11:45:40

回答

0

它就像你正在使用你的產品和地區類之間的關係在我看來。如果是這樣,那麼某個地方,(用於.dbml文件自動生成的LINQ到SQL),存在定義的關係的映射:

[Table(Name = "Product")] 
public partial class Product 
{ 
    ... 
    private EntitySet<Region> _Regions; 
    [Association(Storage = "_Regions")] 
    public EntitySet<Region> Regions 
    { 
     get { return this._Regions; } 
     set { this._Regions.Assign(value); } 
    } 
    ... 
} 

你可以把一些邏輯在這裏訪問,例如:

public IEnumerable<Region> Regions 
{ 
    get { return this._Regions.Where(r => !r.isDeleted); } 
    set { this._Regions.Assign(value); } 
} 

這樣通過product.Regions每次訪問會返回你的過濾枚舉。

+0

我確實在我的DBML中擁有我的實體之間的關係。你的想法很好,但我必須手動添加這些「過濾器」以便每個關係!我正在研究更通用的東西。 – Mathlec 2009-09-30 01:20:59

+0

而順便說一下,this._Regions.Where會返回一個IEnumerable而不是一個EntitySet。 – Mathlec 2009-10-01 19:39:19

1

你可以創建一個實現你的過濾器的擴展方法,並使用它作爲你的約定。

public static class RegionQuery 
{ 
    public static IQueryable<Region> GetAll(this IQueryable<Region> query, bool excludeDeleted=true) 
    { 
     if (excludeDeleted) 
      return query.Regions.Where(r => !r.isDeleted); 

     return query.Regions; 
    } 
} 

所以每當你想查詢你的區域可以進行下面的調用,僅保留住地區仍然提供了一個機會,刪除的文件以獲得爲好。

context.Regions.GetAll(); 

我對於訪問Products屬性有點不習慣,但仍然可行。唯一的問題是你必須遵守的慣例。或者擴展包含類。

someProduct.Regions.GetAll(); 

我希望幫助。這就是我最終解決的問題,因爲我無法找到解決方案,無論是創建更多的間接方法。讓我知道,如果你或其他人有一個解決方案,這其中出現。我很感興趣。