2010-01-01 94 views
2

但是,我一直在我最近的項目中廣泛使用LINQ,但我一直無法找到一種處理對象的方式,看起來不是草率或不切實際。LINQ to SQL業務對象創建最佳實踐

我還會注意到我主要使用ASP.net。

我討厭將我的數據上下文或LINQ返回類型暴露給我的UI代碼。我更喜歡對業務對象進行更細粒度的控制,而且它似乎與db非常緊密地聯繫在一起,成爲最佳實踐。

這裏是我試過的方法..


工程項目爲一個自定義類

dc.TableName.Select(λ => new MyCustomClass(λ.ID, λ.Name, λ.Monkey)).ToList(); 

顯然,這往往會導致大量的wireup代碼用於創建,更新等...


創建包裝器返回的對象

public class MyCustomClass 
{ 
     LinqClassName _core; 

     Internal MyCustomClass(LINQClassName blah) 
     { 
      _core = blah; 
     } 

     int ID {get { return _core.ID;}} 
     string Name { get {return _core.Name;} set {_core.Name = value;} } 
} 

... 
dc.TableName.Select(λ => new MyCustomClass(λ)).ToList(); 

似乎工作得很好,但重新連接更新似乎是幾乎不可能擊敗有所目的。

我也傾向於使用LINQ查詢進行轉換等,通過我的代碼,我很擔心這種方法的速度,儘管我還沒有嘗試過使用足夠大的集合來確認。


創建包裝器返回的對象,而持續的數據上下文

public class MyCustomClass 
{ 
    LinqClassName _core; 
    MyDataContext _dc; 
    ... 
} 

我的對象中堅持的數據上下文大大簡化了更新,但似乎像利用會話狀態特別是當大量的開銷。

快速提示:我知道λ在這裏的用法在數學上並不正確 - 我傾向於將它用於我的綁定變量,因爲它在視覺上很突出,並且在大多數lambda語句中,它是重要的轉換,而不是變量 - 不知道這是否有什麼意義,但沒有說

對不起,這是一個非常長的問題。 預先感謝您的意見和新年快樂!

+2

你真的可以使用這樣的lambda字符嗎?真棒。 – 2010-01-01 07:11:46

+1

我也喜歡lambda字符用法,榮譽。 – 2010-01-01 07:44:58

+0

我無法想象使用λ是否有效,除非您以某種方式將它映射到某個鍵。儘管如此,它看起來很酷。 – Merritt 2012-03-20 21:15:53

回答

2

我在從LINQ查詢返回的表上創建「Map」擴展函數。 Map函數返回一個普通的舊CLR對象。例如:

public static MyClrObject Map(this MyLinqObject o) 
     { 
      MyClrObject myObject = new MyClrObject() 
      { 
       stringValue = o.String, 
       secondValue = o.Second 
      }; 
      return myObject; 
     } 

然後,您可以添加地圖功能來選擇列表中的LINQ查詢並LINQ返回CLR對象,如:

return (from t in dc.MyLinqObject 
      select t.Map()).FirstOrDefault(); 

如果您正在返回一個列表,你可以使用ToList獲取列表<>返回。如果你更喜歡創建自己的列表類型,你需要做兩件事。首先,創建一個構造函數,該構造函數接受基礎類型的IEnumerable <>,因爲它是一個參數。該構造函數應該從IEnumerable <>集合中複製項目。其次,創建一個靜態擴展方法來調用構造函數從LINQ查詢:

 public static MyObjectList ToMyObjectList(this IEnumerable<MyObjectList> collection) 
    { 
     return new MyObjectList (collection); 
    } 

一旦創建了這些方法,他們那種隱藏在後臺。它們不會混淆LINQ查詢,並且不會限制您可以在查詢中執行哪些操作。

此博客entry有一個更透徹的解釋。