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
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)
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.
Veya EmitMapper, daha iyi performansa sahip olduklarını söylüyorlar. – Monsignor
Neden EF değil? Çok ilginç –