繁体   English   中英

多个Group by LINQ扩展方法

[英]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();

C#小提琴

你必须筛选SelectedAnswerIdSelect中没有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM