2016-09-21 4 views
0

Что представляет собой самый эффективный способ перейти от MediaPlanBillingDetails в MediaPlanPrint и рассчитать сумму суммы RoId wise? В основном MediaPlanBillingDetails является базовой таблицей.Как сделать мой linq для сущностей запрос для суммы быстрее

Текущий запрос:

var sumofallbills= MediaPlanBillingDetails.Sum(m => m.MediaPlanRO.MediaPlanROPrints.Sum(qq => qq.MediaPlanPrint.Amount)); 

Пример данных:

var aS = new List<MediaPlanBillingDetails>(); 
     aS.Add(new MediaPlanBillingDetails { BillId = 1, RoID = 1 }); 
     aS.Add(new MediaPlanBillingDetails { BillId = 1, RoID = 2 }); 
     aS.Add(new MediaPlanBillingDetails { BillId = 2, RoID = 3 }); 
     aS.Add(new MediaPlanBillingDetails { BillId = 2, RoID = 4 }); 
     aS.Add(new MediaPlanBillingDetails { BillId = 3, RoID = 5 }); 


     var bs = new List<MediaPlanRo>(); 
     bs.Add(new MediaPlanRo { RoId = 1 }); 
     bs.Add(new MediaPlanRo { RoId = 2 }); 
     bs.Add(new MediaPlanRo { RoId = 3 }); 
     bs.Add(new MediaPlanRo { RoId = 4 }); 
     bs.Add(new MediaPlanRo { RoId = 5 }); 

     var cs = new List<MediaPlanRoDetails>(); 
     cs.Add(new MediaPlanRoDetails { PrintEstimateId = 1, RoId = 1 }); 
     cs.Add(new MediaPlanRoDetails { PrintEstimateId = 2, RoId = 1 }); 
     cs.Add(new MediaPlanRoDetails { PrintEstimateId = 3, RoId = 2 }); 
     cs.Add(new MediaPlanRoDetails { PrintEstimateId = 4, RoId = 3 }); 
     cs.Add(new MediaPlanRoDetails { PrintEstimateId = 5, RoId = 4 }); 
     cs.Add(new MediaPlanRoDetails { PrintEstimateId = 6, RoId = 5 }); 

     var ds = new List<MediaPlanPrint>(); 
     ds.Add(new MediaPlanPrint { PrintEstimateId = 1, Amount = 1000 }); 
     ds.Add(new MediaPlanPrint { PrintEstimateId = 2, Amount = 5000 }); 
     ds.Add(new MediaPlanPrint { PrintEstimateId = 3, Amount = 6000 }); 
     ds.Add(new MediaPlanPrint { PrintEstimateId = 4, Amount = 8000 }); 
     ds.Add(new MediaPlanPrint { PrintEstimateId = 5, Amount = 9000 }); 
     ds.Add(new MediaPlanPrint { PrintEstimateId = 6, Amount = 10000 }); 
+3

Что вы подразумеваете под *, чтобы перейти от MediaPlanBillingDetails к MediaPlanPrint *? –

+0

Означает, что я не могу перейти непосредственно из таблицы1 в таблицу4. Я должен пройти через них – maztt

+1

Быстрее, чем * what *? Трудно сказать, не видя, как выглядит запрос. –

ответ

1

Если у вас нет условий для SUM, попытаться ударить через объект, Вы должны суммировать, для образца:

var result = db.Set<MediaPlanPrint>().Sum(x => x.Amount); 
1

Вы не разместили свои модели, поэтому мы можем только оценить, что у вас есть все свойства навигации. Вы можете попробовать что-то, как показано ниже:

var result = db.Set<MediaPlanPrint>() 
    .Include(m => m.MediaPlanRoDetails) 
    // Filter according to BillId 
    .Where(m => m.MediaPlanRoDetails.MediaPlanRo.MediaPlanBillingDetails.BillId < 100) 
    // Group by RoId 
    .GroupBy(m => m.MediaPlanRoDetails.RoId) 
    .Select(g => new 
    { 
     RoId = g.Key, 
     TotalAmount = g.Sum(m => m.Amount) 
    }) 
    .ToList(); 
+0

Выполняйте .ToList(), только если это окончательный запрос, если нет, например, лучше иметь вещи как IQueryable <>. Как записка ... – Jack1987

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