[英]Multiple Group By LINQ extension methods
我有一个C#.NET应用程序,想在多个条件下进行分组。 我有一个这样的清单:
var testq = new List<TestQuestion>()
{
new TestQuestion
{
Id = 1,
QuestionId = 1,
SelectedAnswerId = null
},
new TestQuestion
{
Id = 2,
QuestionId = 2,
SelectedAnswerId = 1
},
new TestQuestion
{
Id =3,
QuestionId = 1,
SelectedAnswerId = 1
},
new TestQuestion
{
Id = 4,
QuestionId = 3,
SelectedAnswerId = 5
},
new TestQuestion
{
Id = 5,
QuestionId = 1,
SelectedAnswerId = 2
},
new TestQuestion
{
Id = 6,
QuestionId = 3,
SelectedAnswerId = 3
},
new TestQuestion
{
Id =7,
QuestionId = 4,
SelectedAnswerId = null
},
new TestQuestion
{
Id =8,
QuestionId = 5,
SelectedAnswerId = null
},
};
我的代码是:
var result = testq
.Where(p => p.SelectedAnswerId.HasValue)
.GroupBy(p => p.QuestionId)
.Select(p => p.FirstOrDefault())
.ToList();
现在,结果ID为(2,3,4),但结果不正确...
结果应为:ID的->(2,3,4,7,8)
我想根据QuestionID字段将结果分组,第一个没有(SelectedAnswerId)字段值的记录为空,
另外,无论输出中字段的值(SelectedAnswerId)是多少,问题ID仅存在一次的记录。 就是说,列表中的最后两项
请指导我...
尝试这个:
var result = testq
.Where(p => p.SelectedAnswerId.HasValue || testq.Count(x => x.QuestionId == p.QuestionId) == 1)
.GroupBy(p => p.QuestionId)
.Select(p => p.FirstOrDefault())
.Distinct()
.ToList();
你必须筛选SelectedAnswerId
在Select
中没有Where
子句。 试试下面的,
var result = testq
.GroupBy(p => p.QuestionId)
.Select(p =>
{
var grouped = p.ToList(); //Get the groupBy list
TestQuestion testQuestion = grouped.FirstOrDefault(x => x.SelectedAnswerId.HasValue); //Get anything with AnswerId
return testQuestion ?? grouped.FirstOrDefault(); //If not not available with Answer then get the First or Default value
})
.ToList();
C#整理测试数据。
尽管在GroupBy之后,每个组中元素的顺序都得到了明确定义(请参阅Enumerable.GroupBy) ,似乎您想要的元素不是每个组中的第一个元素。
您希望每个组的First元素具有不为null的SelectedAnswerId,或者如果没有这样的元素,则希望每个组的First元素具有不为null的SelectedAnswerId。
这个怎么样:
var result = testQ.GroupBy(question => question.QuestionId);
// every group contains a sequence of questions with same questionId
// select the ones with a null SelectedAnswerId and the ones with a non-null value
.Select(group => new
{
NullSelectedAnswer = group
.Where(group.SelectedAnswerId == null)
.FirstOrDefault(),
NonNullselectedAnswer = group
.Where(group.SelectedAnswerId != null)
.FirstOrDefault(),
})
// if there is any NonNullSelectedAnswer, take that one, otherwise take the null one:
.Select(selectionResult => selectionResult.NonNullSelectedAnswer ??
selectionResult.NullSelectedAnswer);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.