2013-12-20 75 views
-1

我有两个列表LINQ - 集团加入+ Where子句

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 } 
}; 

输出所需

STORENAME =存储1 |总价值= 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(); 

错误: 'O' 不存在于当前上下文存在名称。

在这种情况下,如何按顺序过滤?

+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

好男人。 .. 谢谢! – user3122316