使用Groupby Select和foreach循环查询Linq

时间:2017-07-24 14:19:50

标签: linq

 List<APList> List = new List<APList>() --

List = statement.APList.Where(f => f.PeriodKey == periodkey
                                 && f.ClassKey == classkey
                                 && f.ClassKey != null)
                        .GroupBy(g => new { g.PostKey})
                        .Select(s => s.First()).ToList();

foreach (var item in List)
{
    item.ClassKey = null;
} 

--data 

periodkey(int)  postkey(int)   classkey(int?)       
101          12        10
100          12        11
101          11        10
100          11        11




--expected 

periodkey  postkey   classkey       
101          12        null
100          11        null

这是有效的,但我不想使用foreach循环。有更好的方法来优化查询并使用Lambda表达式在单个linq查询中编写它。

3 个答案:

答案 0 :(得分:0)

您只需选择classKey为null

即可
List = statement.APList.Where(f => f.PeriodKey == periodkey
                                 && f.ClassKey == classkey
                                 && f.ClassKey != null)
                        .GroupBy(g => new { g.PostKey})
                        .Select(s => s.First())
                        .Select(i => new APList() {
                            PeriodKey = i.PeriodKey,
                            ClassKey = null,
                            /* ... */
                        })                            
                        .ToList();

答案 1 :(得分:0)

根据(Assigning values inside a LINQ Select?)的答案,foreach循环(或.ForEach)比使用LINQ更好,因为LINQ用于查询对象,而不是改变它们。

如果您确实想要更换循环,可以使用

List = statement.APList.Where(f => f.PeriodKey == periodkey
                             && f.ClassKey == classkey
                             && f.ClassKey != null)
                       .GroupBy(g => new { g.PostKey})
                       .Select(s => s.First())
                       .ToList();

List.ForEach(i => i.ClassKey = null);

.ForEach必须位于单独的行上,因为它会对List中的每个项执行操作并返回void,而不是项目列表。

答案 2 :(得分:0)

您可以按期间和后期密钥对它们进行分组

var result = statement.APList.Where(ap => ap.PeriodKey == periodkey)
                             .Where(ap => ap.ClassKey == classkey)
                             .Where(ap => ap.ClassKey != null)
                     .GroupBy(ap => new { ap.PeriodKey, ap.PostKey })
                     .Select(group => group.Key);

现在,结果包含唯一periodKeypostKey的匿名对象 您可以使用它们将其与已存在的包含classKey的类混合使用。

或者,如果您仍然想要使用已存在的对象,请创建此类的新实例,并将classKey设置为null

var finalResult = result.Select(group => new AP 
                                { 
                                    PeriodKey = group.PeriodKey,
                                    PostKey = group.PostKey
                                })
                        .ToList();

使用.ForEach扩展方法不会进行优化,因为它会像其他Linq扩展方法一样执行foreach循环。