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查询中编写它。
答案 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);
现在,结果包含唯一periodKey
和postKey
的匿名对象
您可以使用它们将其与已存在的包含classKey
的类混合使用。
或者,如果您仍然想要使用已存在的对象,请创建此类的新实例,并将classKey
设置为null
var finalResult = result.Select(group => new AP
{
PeriodKey = group.PeriodKey,
PostKey = group.PostKey
})
.ToList();
使用.ForEach
扩展方法不会进行优化,因为它会像其他Linq扩展方法一样执行foreach
循环。