我對使用Linq-to-SQL和WCF服務開發n層應用程序時的最佳做法感到好奇。Linq-to-SQL和WCF服務 - 數據傳輸對象
特別是,我對如何從兩個相關表返回到表示層數據感興趣。假設未來形勢(大大簡化):
數據庫有表:
Orders
(id, OrderName
)OrderDetails
(id, orderid, DetailName
)
中間層具有CRUD方法OrderDetails
。所以,我需要有方法來重建實體,以便附加到上下文進行更新或在從表示層返回時插入。
在表示層我需要從父表中顯示OrderDetails
列表和相應的OrderName
。
有上課兩個接近,即從服務返回:
使用DTO定製類,將封裝兩個表和投影數據:
class OrderDetailDTO { public int Id { get; set; } public string DetailName { get; set; } public string OrderName { get; set; } } IEnumerable<OrderDetailDTO> GetOrderDetails() { var db = new LinqDataContext(); return (from od in db.OrderDetails select new OrderDetailDTO { Id = od.id, DetailName = od.DetailName, OrderName = od.Order.OrderName }).ToList(); }
缺點:需要分配每字段對於表示層而言都是重要的(在返回數據時和創建用於附加到上下文的新實體時,當數據從表示層返回時)
使用自定義的LINQ到SQL實體部分類:
partial class OrderDetail { [DataMember] public string OrderName { get { return this.Order.OrderName // return value from related entity } set {} } } IEnumerable<OrderDetail> GetOrderDetails() { var db = new LinqDataContext(); var loadOptions = new DataLoadOptions(); loadOptions.LoadWith<OrderDetail>(item => item.Order); db.LoadOptions = options; return (from od in db.OrderDetails select od).ToList(); }
缺點:數據庫查詢將包括Orders
表中的所有列,LINQ到SQL一定會實現整個訂單的實體,儘管我只需要一個字段。
對不起,這麼長的故事。可能是我錯過了什麼?將欣賞任何建議。
或EmitMapper,他們說它有更好的性能。 – Monsignor 2011-12-23 02:11:08
爲什麼不EF?非常有趣 – 2014-07-29 03:54:47