2011-12-22 62 views
5

我對使用Linq-to-SQL和WCF服務開發n層應用程序時的最佳做法感到好奇。Linq-to-SQL和WCF服務 - 數據傳輸對象

特別是,我對如何從兩個相關表返回到表示層數據感興趣。假設未來形勢(大大簡化):

數據庫有表:

  • Ordersid, OrderName
  • OrderDetailsid, orderid, DetailName

中間層具有CRUD方法OrderDetails。所以,我需要有方法來重建實體,以便附加到上下文進行更新或在從表示層返回時插入。

在表示層我需要從父表中顯示OrderDetails列表和相應的OrderName

有上課兩個接近,即從服務返回:

  1. 使用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(); 
    } 
    

    缺點:需要分配字段對於表示層而言都是重要的(在返回數據時和創建用於附加到上下文的新實體時,當數據從表示層返回時)

  2. 使用自定義的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一定會實現整個訂單的實體,儘管我只需要一個字段。

對不起,這麼長的故事。可能是我錯過了什麼?將欣賞任何建議。

回答

3

我會說使用DTO和Automapper,不是一個好主意,露出DB實體datacontract

+0

或EmitMapper,他們說它有更好的性能。 – Monsignor 2011-12-23 02:11:08

+0

爲什麼不EF?非常有趣 – 2014-07-29 03:54:47

1

是的LINQ的使用到SQL的要求,爲您或您仍處於設計階段,你可以選擇技術?如果最新,我會建議使用實體框架與自我跟蹤實體(STE)。當你從客戶端獲得實體時,所有客戶端更改將由STE自動處理,只需調用Save即可。包括相關實體也很容易:(...some query...).Orders.Include(c => c.OrderDetails)

+0

不幸的是我處於發展階段。我正在考慮遷移到EF,但由於時間限制,暫時不是一個選擇。 – Harm 2011-12-22 12:12:23