2008-09-17 61 views
3

我想從我的LinqToSQL產生的DataContext繼承 - 這樣的事情限制System.Data.Linq.Table的結果<T>

public class myContext : dbDataContext { 
public System.Data.Linq.Table<User>() Users { 
    return (from x in base.Users() where x.DeletedOn.HasValue == false select x); 
} 
} 

但我的LINQ語句返回的IQueryable不能轉換爲表 - 沒有任何人知道限制一個Linq.Table的內容的方法 - 我試圖確保我的用戶表訪問的任何地方,它不返回那些標記爲已刪除的。也許我對這一切都是錯誤的 - 任何建議將不勝感激。

哈爾

回答

2

另一種方法是使用視圖..

CREATE VIEW ActiveUsers as SELECT * FROM Users WHERE IsDeleted = 0 

至於LINQ to SQL的來講,這僅僅是同一個表。對於任何需要進行DeletedOn過濾的表,只需創建一個使用過濾器的視圖,並使用該過濾器代替數據上下文中的表。

1

你可以在桌子上使用鑑別列繼承,即。一個DeletedUsers表和ActiveUsers表,其中鑑別器列表示哪個表。然後在你的代碼中,只需引用Users.OfType的ActiveUsers,它永遠不會包含任何被刪除的東西。

作爲一個側面說明,你是怎麼做到這一點與降價?

Users.OfType<ActiveUsers> 

我能得到它的代碼,而不是內聯

+0

感謝您的迴應。我正在嘗試查看是否可以使用此解決方案。您是否知道如何檢查Derived Class Discriminator Value屬性的空值? – Hal 2008-09-17 17:38:20

+0

我之前沒有用過這麼多,所以我現在正在玩這個。我會更新我發現的內容。 – 2008-09-17 17:42:22

+0

它看起來像InheritanceDefault屬性應該處理這個,但不像我所期望的那樣工作。 – 2008-09-17 18:14:07

0

您可以使用存儲過程返回所有在表中的映射列所有未標記刪除的記錄,然後映射LINQ到SQL類到存儲過程的結果。我想你只需將存儲在服務器資源管理器中的proc拖放到LINQ to SQL設計器中的類中即可。

0

我所做的這個情況是我創建的回傳IQueryable的一個倉儲類,但基本上只是

從噸_db.Table
選擇T;

這通常由tableRepository.GetAllXXX()引用;但你可以有一個tableRepository.GetAllNonDeletedXXX();在那個初始where子句中放入刪除的行。這將允許您使用不同的方法取回刪除的文件,未刪除的文件和所有行。

0

也許我對凱文謝菲爾德的響應的評論可能揭示什麼,我試圖完成一些輕:

我有我的數據訪問最 一個相似的庫,但我想 能以遍歷我的關係 並保持DeletedOn邏輯, 而不實際調用任何 其他方法。對象是 詢問(拼寫固定)由StringTemplate 處理器,不能調用方法 (只是道具/領域)。

我最終需要對我的應用程序中的所有表進行這種DeletedOn過濾。 Scott Nichols的繼承類解決方案應該可以工作(儘管我需要爲大約30個表派生一個類和關係 - 哎喲),儘管我需要弄清楚如何檢查我的Derived Class Discriminator Value屬性中的空值。

我可能只落得延長我所有的類專門爲StringTemplate的處理,明確加入了我需要的關係性質,我只想愛能夠拋出一個StringTemplate的[用戶],並已將它通過一切行走。

0

我們在關聯中使用了幾個視圖,它們仍然像任何其他關係一樣出現。我們確實需要手動添加關聯。我能想到的唯一建議是查看爲這些類和關聯生成的屬性和裝飾屬性。

添加一些具有相同關係的表並將它們與未顯示的視圖進行比較。

此外,有時服務器資源管理器連接上的刷新似乎不能正常工作,並且最初沒有正確創建實體,除非我們將它們從設計器中刪除,關閉項目,然後重新打開項目並添加它們再次從服務器瀏覽器。這假設你正在使用Visual Studio 2008和linq to sql .dbml設計器。

1

封裝您的DataContext,以便開發人員不要在其查詢中使用Table。我在我的存儲庫上有一個「全部」屬性,可以根據需要進行類似的過濾。所以後來查詢是這樣的:

from item in All 
where ... 
select item 

和所有可能是:

public IQueryable<T> All 
{ 
    get { return MyDataContext.GetTable<T>.Where(entity => !entity.DeletedOn.HasValue); } 
} 
0

我發現我有關係/協會的意見不顯示的問題。看起來你必須通過dbml中的每個類併爲視圖設置主鍵,因爲它無法從模式中提取該信息。我現在正在設置主鍵,並計劃去查看路由以隔離只有未刪除的項目。

謝謝,我會在稍後更新。