2013-12-20 6 views
-1

У меня есть два спискаLINQ - Группа Регистрация + ИНЕКЕ

var stores = new[] 
{ 
    new { Code = 1, Name = "Store 1" }, 
    new { Code = 2, Name = "Store 2" }  
}; 

var orders = new[] 
{ 
    new { Code = 1, StoreCode = 1, TotalValue = 4.12 }, 
    new { Code = 2, StoreCode = 1, TotalValue = 14.12 }, 
    new { Code = 3, StoreCode = 1, TotalValue = 24.12 } 
}; 

OUTPUT желательно

StoreName = Магазин 1 | TotalValue = 38,24

LINQ к SQL LINQ к объектам

var result = (from s in stores 
       join o in orders on s.Code equals o.StoreCode into grp 
       where o.TotalValue > 10 // error 
       select new 
       { 
        StoreName = s.Name, 
        TotalValue = grp.Sum(x => x.TotalValue) 
       }).ToList(); 

Ошибка: имя 'о' не существует в текущем контексте.

В этом случае, как фильтровать по заказу?

+5

Удалив вопрос и повторно разместить его, слово в слово, только потому, что он получил downvotes, неуместна и, скорее всего, приведет к вам запретили задавать вопросы будущее. – Servy

+0

http://stackoverflow.com/questions/20707635/linq-group-join-and-where-clause#20707635 – Servy

+0

@Servy Я этого не знал. Сожалею! – user3122316

ответ

5

Попробуйте это:

var result = (from s in stores 
       join o in orders.Where(x => x.TotalValue > 10) on s.Code equals o.StoreCode into grp 
       select new 
       { 
        StoreName = s.Name, 
        TotalValue = grp.Sum(x => x.TotalValue) 
       }); 

Или это

var result = (from s in stores 
       join o in orders on s.Code equals o.StoreCode into grp 
       select new 
       { 
        StoreName = s.Name, 
        TotalValue = grp.Where(x => x.TotalValue > 10) 
            .Sum(x => x.TotalValue) 
       }); 

Обратите внимание, что, как правило, нет необходимости вызывать ToList, так как это требует немедленной оценки запроса. В большинстве случаев достаточно оставить IEnumerable<T>. Кроме того, это также вернет строку для «Store 2», с TotalValue = 0. Если вы также хотите опустить эти строки, вы можете использовать что-то вроде этого.

var result = (from s in stores 
       join o in orders.Where(x => x.TotalValue > 10) on s.Code equals o.StoreCode into grp 
       let totalValue = grp.Sum(x => x.TotalValue) 
       where totalValue > 0 
       select new 
       { 
        StoreName = s.Name, 
        TotalValue = totalValue 
       }); 

Или это

var result = (from s in stores 
       join o in orders on s.Code equals o.StoreCode into grp 
       let totalValue = grp.Where(x => x.TotalValue > 10) 
            .Sum(x => x.TotalValue) 
       where totalValue > 0 
       select new 
       { 
        StoreName = s.Name, 
        TotalValue = totalValue 
       }); 
+0

Nice man. .. благодаря! – user3122316

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