Ç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.
Bu, kullanmayı sonlandırdığım yaklaşımdır. Faydalı tavsiyeler, teşekkürler. –
Eğer bir pürist iseniz, IList'e dönersiniz;) Veya daha iyisi IEnumerable –