2011-04-13 3 views
4

У меня есть несколько запросов linq, которые извлекают одни и те же данные только на разных уровнях группировки. (потенциально 3 разных уровня). Запрос linq в настоящее время приводит к перечисляемому списку настраиваемого объекта. Элементы, которые я не понимаю или не понимаю, если это возможно (для сокращения избыточного кода):динамическая группа linq по предложению

Могу ли я сделать следующее предложение group by for dynamic? Если это так, может ли он динамически заполнять мои данные пользовательской группы объектов, когда он сгруппирован на этом уровне.

Например:

var myReport_GroupProductLevel = 
       from r in mySum_GroupProductLevel 
       join pc in _myPlotCount on r.Strata equals pc.Strata 
       join acr in _myStrataAcres on pc.Strata equals acr.Strata 
       group new { r, pc, acr } by new { r.Strata, pc.Count, acr.Acres, r.GroupName, r.ProductName } into g 
       select new DataSummary 
       { 
        Strata = g.Key.Strata, 
        PlotCount = g.Key.Count, 
        Acres = g.Key.Acres, 
        ClassName = string.Empty, 
        GroupName = g.Key.GroupName, 
        ProductName = g.Key.ProductName, 
        TPAMEAN = g.Sum(x => x.r.TPA/x.pc.Count), 
        TPADEV = g.Select(x => x.r.TPA).StdDev(g.Key.Count) 
       }; 

Если бы я хотел, чтобы группа только «ИмяГруппы» вместо того, чтобы ... Я бы переписать запрос. Проблемы, которые я вижу, являются, если я группирую значение, тогда мне нужно это значение в запросе (g.Key.GroupName); но поскольку я создаю новый пользовательский объект, другие негрупповые значения, такие как «ClassName», требуют значения (я использовал string.Empty выше, но это статический).

Спасибо за любой проницательности ...

ответ

8

если кто-нибудь было интересно, я получил его на работу с помощью условного оператора ... поскольку группировка по пустой сделает это развалится.

var mySum_ClassGroupProductLevel = 
       from s in ReportData.myStands 
       join p in ReportData.myPlots on s.ID equals p.StandID 
       join t in ReportData.myTrees on p.ID equals t.PlotID 
       group t by new { s.Strata, p.ID, 
        ClassName = useClassName ? t.ClassName : string.Empty, 
        GroupName = useGroupName ? t.GroupName : string.Empty, 
        ProductName = useProductName ? t.ProductName : string.Empty } 
        into g 
       select new 
       {} 
+0

Благодарим вас за продолжение. – SixOThree

Смежные вопросы