2011-12-22 13 views
5

Linq-to-SQL ve WCF hizmeti ile n-katmanlı uygulama geliştirirken en iyi uygulamayı merak ediyorum. Özellikle, iki ilgili tablodaki sunum katmanı verilerine nasıl dönüleceğine özellikle ilgi duyuyorum. (Çok basitleştirilmiş) sonraki durumu varsayalım:Linq-to-SQL ve WCF hizmeti - veri aktarım nesneleri

Veritabanı masaları vardır:

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

Orta kademe OrderDetails için CRUD yöntemleri vardır. Bu nedenle, sunu katmanından döndüğünde güncelleme veya ekleme için içeriğe eklenmesi için öğeyi yeniden oluşturma yoluna ihtiyacım var.

Sunu katmanında, üst tablodan ilgili OrderName numaralı OrderDetails listesini görüntülemem gerekiyor.

hizmetinden döndürülen sınıflar için iki yaklaşım vardır:

    tablo ve projeksiyon hem veri içine alır
  1. Kullanım DTO özel sınıfı:

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

    Eksileri: atama ihtiyacını her iki tarafta da sunum katmanı için önemli olan her alanı (veri döndürülürken ve içeriğe eklenmek için yeni varlık oluştururken, sunum katmanından veri geldiğinde)

  2. Kullanımı özelleştirilmiş Linq SQL varlık kısmi sınıfı:

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

Eksileri: veritabanı sorgusu SQL Linq bütün Sipariş varlık gerçekleşip gerçekleşmeyeceği Orders tablodan tüm sütunları içerecektir I rağmen ondan sadece bir alana ihtiyacım var.

Böyle uzun bir hikaye için özür dilerim. Bir şey özlemiş olabilir miyim? Herhangi bir öneriniz için teşekkür ederiz.

cevap

3

Ben kullanım DTO ve Automapper değil DataContract

+0

Veya EmitMapper, daha iyi performansa sahip olduklarını söylüyorlar. – Monsignor

+0

Neden EF değil? Çok ilginç –

1
olarak DB varlık göstermek için iyi bir fikir söyleyebilirim

Linq kullanımı sizin için bir gereksinim SQL veya size teknolojilerini seçebilir tasarım aşamasında hala var mı? En geç ise, Entity Framework'ü Kendini Takip Varlıkları (STE) ile kullanmanızı öneririm. Müşteriden varlık aldığınızda, tüm müşteri değişiklikleri otomatik olarak STE'ler tarafından ele alınacaktır, sadece Kaydet'i çağırmanız gerekecektir. İlgili varlıklar da dahil olmak üzere aşağıdakileri de kolayca yapabilirsiniz:

+0

Maalesef geliştirme aşamasındayım. EF'e göç etmeyi düşünüyordum, ama zaman sınırı nedeniyle bir an için bir seçenek değil. – Harm

İlgili konular