2012-09-21 71 views
4

是否有可能爲每個由Linq-to-SQL類生成的SQL語句添加default where子句?將缺省where子句添加到linq-to-sql表中

我有一個客戶類的自定義DataContext。 Customer類有一個Deleted屬性,每當我查詢表時,我都希望它是NULL

因此,例如,我可以寫:

List<Customer> customers = db.Customers.ToList<Customer>(); 

但真正獲得:

List<Customer> customers = db.Customers.Where(o => o.Deleted == null).ToList<Customer>(); 

我要保持我的數據庫「已刪除」的數據,但絕不需要看到它在我的.NET代碼。這種默認方式很方便,所以我不必記得將過濾器添加到每個查詢中。

+3

不是將表添加到您的dbml設計器,而是添加一個包含默認where子句的視圖,並僅在您的dbml中將視圖命名爲Customer。 – hatchet

+0

看到我添加的答案。我已經包含有關更新的信息。 – hatchet

回答

1

而是加入將表添加到您的dbml設計器,添加一個包含默認where子句的視圖,並在您的dbml中將視圖命名爲Customer。

要允許更新,插入和刪除,請確保您選擇DBML設計器中的主鍵列,並將它們的Primary Key屬性標記爲true。

+0

經過一些更多的測試後,我實際上能夠插入和更新就好了,除了當我嘗試更新已刪除的字段。當我調用'SubmitChanges()'時,我得到'ChangeConflictException - 行未找到或改變.'。我猜這是由於它正在尋找視圖,它不包含該記錄,因爲在我的DataContext的頭腦中,Deleted不再是'null'。 – Paul

+0

發現此問題。我必須將計算列從AutoSync = Always更改爲AutoSync = Never。 – Paul

4

您可以添加一個名爲ActiveCustomers新的屬性,返回此:

public IQueryable<Customer> ActiveCustomers { 
    get { return db.Customers.Where(e => e.Deleted == null); } 
} 

針對財產的任何疑問可以指定其他Where條件,否則修改的結果,但他們將永遠是開始與客戶誰尚未被刪除。由於LINQ延遲執行,這個語句不會導致任何額外的查詢被執行。

如果您需要確保沒有人可以進入db.Customers你可以嘗試做這樣的事情來隱藏它(可能無法正常工作,我需要看到你的實現):

public new IQueryable<Customer> Customers { 
    get { 
     throw new InvalidOperationException("Use property ActiveCustomers instead."); 
    } 
} 
+0

這個解決方案的問題是,當我創建'新的IQueryable 客戶'時,我得到了與原始客戶之間的歧義錯誤,它返回'System.Linq.Table '。但是我無法刪除原始內容,因爲那時我的InsertOnSubmit調用失敗了,因爲它試圖對'IQueryable'執行此操作。 – Paul

+0

@Paul如果您使用存儲庫模式的實現,則不應直接針對上下文查詢。 – Yuck