Linq-to-SQL und WCF-service - Daten-Objekte übertragen

Ich bin neugierig auf best practice bei der Entwicklung von n-tier-Anwendung mit Linq-to-SQL und WCF-Dienst.

Insbesondere bin ich interessiert, zum Beispiel, wie man zurückkehren zu Präsentation tier-Daten aus zwei verknüpften Tabellen. Nehme an, nächste situation (stark vereinfacht):

Datenbank hat Tabellen:

  • Orders (id, OrderName)
  • OrderDetails (id, orderid, DetailName)

Middle tier hat CRUD-Methoden für OrderDetails. So, ich muss Methode zur Wiederherstellung der Einheit zur Befestigung an den Rahmen für update-oder insert-wenn es wieder aus der Präsentations-Schicht.

In der presentation layer muss ich anzeigen Liste der OrderDetails mit entsprechenden OrderName aus der übergeordneten Tabelle.

Gibt es zwei Ansatz für Klassen, die vom Dienst zurückgegebenen:

  1. Verwenden DTO benutzerdefinierte Klasse, die werde einkapseln von Daten aus beiden Tabellen und Projektion:

    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();
    }

    Nachteile: zuweisen müssen jeder Feld ist wichtig für den presentation layer in beide Richtungen (beim zurückgeben von Daten und bei der Erstellung von neuen Unternehmen für die Befestigung an Rahmen, wenn die Daten wieder aus der presentation layer)

  2. Verwenden Sie benutzerdefinierte Linq-to-SQL, entity partielle Klasse:

    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();
    }

Nachteile: Datenbank-Abfrage alle Spalten aus Orders Tabelle, Linq-to-SQL realisiert ganze Order-Entität, obwohl ich brauche nur ein Feld von es.

Sorry für diese lange Geschichte. Kann sein das ich etwas verpasst? Schätzen Anregungen.

InformationsquelleAutor Harm | 2011-12-22
Schreibe einen Kommentar