我在一個應用程序中有幾個區域正在構建,看起來我可能不得不違反DRY(不要重複自己)原則中的生活日光。我真的很喜歡保持乾爽,不會感到困惑,並想知道是否有人能夠給我一個雨披。爲了背景,我使用C#/ .NET 3.51 SP1,Sql Server 2008和Linq-to-Sql。C#泛型問題
基本上,我的情況圍繞以下情況。我需要能夠從數據庫中幾乎任何表格中檢索過濾項目列表,或者我需要能夠從數據庫中的任何表中檢索單個項目,並給定主鍵的ID。我非常肯定,解決這些問題的最佳解決方案將涉及到大量的仿製藥和/或反思。
以下是兩個挑戰的更深入一點。 (請原諒的詳細程度。)
- 給定一個表名(或者一個多元化的表名),我想能夠檢索表中的元素的過濾列表。具體而言,該功能將與查找表一起使用。 (在這個數據庫中有大約50個查找表,經常會添加和/或刪除額外的表)。當前的查找表都實現了一個名爲IReferenceData的接口(我的),並且具有ID(PK),Title,Description和活躍。
對於這些查找表中的每一個,我都需要返回所有記錄的列表。其他時候,我只需要返回活動記錄。任何Linq-to-Sql數據上下文都會自動爲每個TableName包含一個List屬性。不幸的是,我不相信我可以使用它的原始形式,因爲它是未經過濾的,我需要在IsActive屬性上應用過濾器。
一個選項是爲所有50個表編寫類似於以下代碼的代碼。育!
public List<AAA> GetListAAA(bool activeOnly)
{
return AAAs.Where(b => b.IsActive == true || b.IsActive == activeOnly).OrderBy(c => c.Title).ToList();
}
這不會太難,但它確實增加了維護的負擔。
注意:當返回列表時,我維護基礎數據類型非常重要。這些查找表中的記錄可能會被修改,我必須適當地應用更新。
- 對於我的150個表中的每一個,我需要能夠通過主鍵ID檢索單個記錄(FirstOrDefault或SingleOrDefault)。再次,我寧願不要多次寫這個相同的代碼。我寧願有一種方法可以用於我的所有表格。
我不確定最好的方法會在這裏。我想到的一些可能性包括以下幾點。 (我沒有關於它們實現的具體想法,我只是將它們列爲思考的食物)。
A.在數據上下文中有一個像GetTableNameItemByID(Guid id)這樣的方法。 (好) B.在數據上下文中有一個像GetItem這樣的擴展方法(this,string tableName,Guid id)。 (更好) C.有一個像GetItem(this,Table,Guid id)的泛型方法或擴展方法。 (我甚至不知道這是否可能,但是這將是最乾淨的使用。)(最佳)
其他注意事項
由於各種各樣的原因,我已經創建了一個局部類我的數據上下文。如果方法作爲常規方法包含在該部分類中,或者在擴展方法的單獨靜態類中包含,那肯定是可以接受的。
你有沒有考慮使用不同的ORM? LinqToSql在其對真實生活場景的支持方面很不錯(至少部分表現爲圍繞它創建的工具的數量,使其更加豐富)。你可以隨時推出自己的產品,有時你必須去做,但這似乎並不是這些情況之一。 – 2009-09-12 11:20:50