Aşağıdaki LINQ sorgusunu, kullanıcı girdisine bağlı olarak birkaç gruplama sütununu kabul eden Dinamik LINQ'a çevirmem gerekiyor. Temel olarak gruplamaları uygulayan bir grup dropdownlistim var ve gruplandırmanın her bir birleşimini sıralamak istemiyorum. Dinamik LINQ başarısız olursa, el ile bir SQL sorgusu oluşturmanız gerekebilir ve kimse bunu istemez.Dinamik LINQ GroupBy Çoklu Sütunlar
var grouping = (from entry in ObjectContext.OmniturePageModules
where entry.StartOfWeek >= startDate && entry.StartOfWeek <= endDate &&
(section == "Total" || section == "All" || entry.Section == section) &&
(page == "Total" || page == "All" || entry.Page == page) &&
(module == "Total" || module == "All" || entry.Module == module)
group entry by new
{
entry.Page, // I want to be able to tell this anonymous type
entry.Module, // which columns to group by
entry.StartOfWeek // at runtime
}
into entryGroup
select new
{
SeriesName = section + ":" + entryGroup.Key.Page + ":" + entryGroup.Key.Module,
Week = entryGroup.Key.StartOfWeek,
Clicks = entryGroup.Sum(p => p.Clicks)
});
Dynamic LINQ tamamen dışında belgelenmemiş olarak bunun nasıl hiçbir ipucu var "Merhaba dünya!" vakaları/siparişi/siparişi seçin. Ben sadece sözdizimini anlayamıyorum. :(gibi
şey?)
var grouping = ObjectContext.OmniturePageModules.Where(entry => entry.StartOfWeek >= startDate && entry.StartOfWeek <= endDate &&
(section == "Total" || section == "All" || entry.Section == section) &&
(page == "Total" || page == "All" || entry.Page == page) &&
(module == "Total" || module == "All" || entry.Module == module))
.GroupBy("new (StartOfWeek,Page,Module)", "it")
.Select("new (Sum(Clicks) as Clicks, SeriesName = section + key.Page + Key.Module, Week = it.Key.StartOfWeek)");
Ben System.Linq.Dynamic içinde DynamicQueryable sınıfını kullanıyorum. Bkz: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
Takibi: Enigmativity çözümü çoğunluklaçalıştı. - Nedense o datetime göre gruplandırmak istemiyor "startofweek" sütunu geçici çözüm sadece ikincil bir gruplandırma yapmaktır:
var entries = (from entry in ObjectContext.OmniturePageModules
where entry.StartOfWeek >= startDate
&& entry.StartOfWeek <= endDate
&& (section == "Total" || section == "All" || entry.Section == section)
&& (page == "Total" || page == "All" || entry.Page == page)
&& (module == "Total" || module == "All" || entry.Module == module)
select entry).ToArray(); // Force query execution
var grouping = from entry in entries
let grouper = new EntryGrouper(entry, section, page, module)
group entry by grouper into entryGroup
select new
{
entryGroup.Key.SeriesName,
entryGroup.Key.Date,
Clicks = entryGroup.Sum(p => p.Clicks),
};
var grouping2 = (from groups in grouping
group groups by new {groups.SeriesName, groups.Date } into entryGroup
select new
{
entryGroup.Key.SeriesName,
entryGroup.Key.Date,
Clicks = entryGroup.Sum(p => p.Clicks),
});
ama bu ciddi aşağılamak gibi görünüyor performans ... =/
Kapsamlı cevabınız için çok teşekkür ederim. Bunu yarın deneyeceğim ve benim için işe yarayıp yaramadığını size söyleyeyim - bu konuda hızlı bir bakış cesaret vericidir. –
Bu, StartOfWeek tarafından herhangi bir nedenden dolayı grup görünmüyor.Her sütun için gruplama kodunu değiştirmek zorunda kaldım (_section == "Tümü") return _entry.Section; döndürme _section; –
@ Daniel Coffman - Neden StartOfWeek tarafından gruplandırılmadığını bilmiyorum, olması gerekiyordu. Kodu yeniden kontrol ettim ve 'Equals' & GetHashCode 'yöntemleri' StartOfWeek' değerini kullanır. Bana daha fazla bakmamı istersen bana bağırma. Her sütun için gruplandırma kodunun muhtemelen ihtiyaçlarınız için "tweaked" olması gerekeceğini ummuştum. Çözümünüzü takip etmek için – Enigmativity