Почему я не могу сделать подсчет после GroupBy с LINQ - PullRequest
0 голосов
/ 25 марта 2020

У меня есть следующие классы:

public class LogViews
{
    public string DateYYMMDD { get; set; }
    public string Mode { get; set; }
    public int LearnViews { get; set; }
    public int PracticeViews { get; set; }
    public int QuizViews { get; set; }
}

public class Views2Model
{
    public string DateYYMMDD { get; set; }
    public int Devices { get; set; }
    public int? LearnViews { get; set; }
    public int? PracticeViews { get; set; }
    public int? QuizViews { get; set; }
}

Что я хотел бы сделать, это получить счет при группировке по дате:

var ViewCount = CreateExcelFile.ListToDataTable(Views
            .GroupBy(x => x.DateYYMMDD)
            .OrderBy(g => g.Key)
            .Select(g => new Views2Model
            {
                DateYYMMDD = $"20{g.Key.Substring(0, 2)}/{g.Key.Substring(2, 2)}/{g.Key.Substring(4, 2)}",
                Devices = g.Count(),
                LearnViews = g.LearnViews.Count(),
                PracticeViews = g.PracticeViews.Count(),
                QuizViews = g.QuizViews.Count(),
            })
            .ToList());

Но я получаю ошибки для g.LearnViews, g.PracticeViews и g.QuizViews

GetViews.cs(36,36): Error CS1061: 'IGrouping<string, LogViews>' does not contain a definition for 'LearnViews' and no accessible extension method 'LearnViews' accepting a first argument of type 'IGrouping<string, LogViews>' could be found (are you missing a using directive or an assembly reference?) (CS1061) (Cosmos)

Может кто-нибудь дать совет, что я делаю неправильно?

Ответы [ 3 ]

7 голосов
/ 25 марта 2020

Вы относитесь к группе так, как будто это одна запись. В вашем выборе g представляет группу. Один объект группы имеет общий Key, но содержит много элементов «Просмотр». Поэтому вам нужно Sum отдельные значения записи для LearnViews, et c.

var ViewCount = CreateExcelFile.ListToDataTable(Views
            .GroupBy(x => x.DateYYMMDD)
            .OrderBy(g => g.Key)
            .Select(g => new Views2Model
            {
                DateYYMMDD = $"20{g.Key.Substring(0, 2)}/{g.Key.Substring(2, 2)}/{g.Key.Substring(4, 2)}",
                Devices = g.Count(),
                LearnViews = g.Sum(gi => gi.LearnViews),
                PracticeViews = g.Sum(gi => gi.PracticeViews),
                QuizViews = g.Sum(gi => gi.QuizViews),
            })
            .ToList());
4 голосов
/ 25 марта 2020

Возможно, вы испортили использование функции LINQ. g не LogViews, но IEnumerable<LogViews>. Как я вижу в вашем коде, вы использовали g.Count(), но в LogViews не определена функция Count, верно?

3 голосов
/ 25 марта 2020

Вы можете сделать Count() только для объекта IEnumerable.

LearnViews - это int.

То, что вы хотите сделать, это: LearnViews = g.Sum(v => v.LearnViews)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...