2008-09-06 17 views
6

Çalıştığım web uygulamasının bir bölümü, yönetimden 1 ... n kullanıcılara mesajlar görüntüleyen bir alandır. LINQ to SQL sınıflarını ve UI olan bir web sitesi projesini içeren bir DataAccess projem var. Benim veritabanı şöyle görünür:En iyi uygulamalar yeniden: LINQ Veri erişimi için SQL'e

Kullanıcı -> MessageDetail < - Message < - MessageCategory

MessageDetail da IsRead bayrağı içeren bir katılmak tablodur.

İleti listesi kategoriye göre gruplandırılmıştır. Sayfada iki yuvalanmış ListView denetimi var - Bir grup adı çıktı, MessageDetails ile iç içe ikinci bir iç içe ve iletileri kendileri çıktı. çalışır

protected void MessageListDataSource_Selecting(object sender, LinqDataSourceSelectEventArgs e) 
{ 
    var db = new DataContext(); 

    // parse the input strings from the web form 
    int categoryIDFilter; 
    DateTime dateFilter; 
    string catFilterString = MessagesCategoryFilter.SelectedValue; 
    string dateFilterString = MessagesDateFilter.SelectedValue; 
    // TryParse will return default values if parsing is unsuccessful (i.e. if "all" is selected"): 
    // DateTime.MinValue for dates, 0 for int 
    DateTime.TryParse(dateFilterString, out dateFilter); 
    Int32.TryParse(catFilterString, out categoryIDFilter); 
    bool showRead = MessagesReadFilter.Checked; 

    var messages = 
     from detail in db.MessageDetails 
     where detail.UserID == (int)Session["UserID"] 
     where detail.Message.IsPublished 
     where detail.Message.MessageCategoryID == categoryIDFilter || (categoryIDFilter == 0) 
     where dateFilter == detail.Message.PublishDate.Value.Date || (dateFilter == DateTime.MinValue) 
     // is unread, showRead filter is on, or message was marked read today 
     where detail.IsRead == false || showRead || detail.ReadDate.Value.Date == DateTime.Today 
     orderby detail.Message.PublishDate descending 
     group detail by detail.Message.MessageCategory into categories 
     orderby categories.Key.Name 
     select new 
     { 
      MessageCategory = categories.Key, 
      MessageDetails = categories.Select(d => d) 
     }; 

    e.Result = messages; 
} 

Bu kod, ama sadece düşünmediği bir LinqDataSource denetimi için kod arkasında böyle büyük bir LINQ ifadesi yapışmasını': Aşağıdaki kod var mesajları listeleyen bir sayfa için arkada kodunda Benimle otur.

Hala kullanıcı arabiriminde sorguları kodluyor gibi görünüyor, sadece şimdi SQL yerine LINQ var. Ancak, L2S sınıfları ve UI arasında başka bir katman oluşturmanın LINQ'un bazı esnekliklerini azaltacağını düşünüyorum. Verileri almak için yazdığınız kod miktarını azaltmak için tüm nokta değil mi?

Göremediğim bazı olası orta zemin var mı, yoksa sadece LINQ to SQL'in kullanılma şeklini yanlış anlamış mıyım? Tavsiye büyük ölçüde takdir edilecektir.

cevap

5

Tüm LINQ sorgularınız, ADO gibi eski yöntemlerden hiçbir değişiklik olmadan iş mantığı sınıfı olmalıdır.

Eğer bir purist iseniz, iş sınıfındaki yöntemlerden her zaman Listeyi (T) döndürmeniz gerekir, aslında, veri katmanı yalnızca iş sınıfları tarafından görülebilir olmalıdır. Sonra, kullanıcı arayüzünde listeyi değiştirebilirsiniz.

pragmatist kullanıyorsanız, bir IQueryable nesnesini döndürebilir ve kullanıcı arabiriminde bazı değişiklikler yapabilirsiniz.

+0

Bu, kullanmayı sonlandırdığım yaklaşımdır. Faydalı tavsiyeler, teşekkürler. –

+4

Eğer bir pürist iseniz, IList'e dönersiniz;) Veya daha iyisi IEnumerable –

1

LINQ'den bağımsız olarak, sunu kodunun veritabanıyla ilişkilendirilmiş kodla karıştırılmasının iyi bir fikir olmadığını düşünüyorum. LINQ sorgularının üstünde basit bir DB soyutlama katmanı oluşturabilirim. Benim düşünceme göre LINQ, geleneksel uygulama tasarımı üzerinde ciddi bir etkisi olmayan kullanışlı bir araçtır.