ASP NET MVC Как вызвать Count для атрибута, а затем распечатать отсортированный список? - PullRequest
0 голосов
/ 19 апреля 2011

Скажи, что у меня был класс:

public class Post
{
    public int PostId { get; set; }
    public string Topic { get; set; }
    public int UserId { get; set; }
    [StringLength(5000)]
    public string Body { get; set; }
    public DateTime DateCreated { get; set; }
    public string Name { get; set; }
    public int Votes { get; set; }
} 

И для каждого сообщения пользователь может ввести тему. Например, если темы были «Красные», «Зеленые», «Синие» и «Желтые», как я могу создать список, основываясь на том, сколько раз они использовались?

Пример вывода:

Red   | 70
Blue  | 60
Green | 40
Yellow| 35

РЕДАКТИРОВАТЬ: Почему это не работает и выдает ошибку, когда я не могу неявно преобразовать тип?

public List<string> GetPopularTopics(int count)
    {
        var posts = from p in db.Posts
                    group p by p.Topic into myGroup
                    select new
                    {
                        Topic = myGroup.Key,
                        Count = myGroup.Count()
                    };
        return posts.ToList();
    }

РЕДАКТИРОВАТЬ 2:

Итак, я опробовал ваше решение на Дастине, и у меня появляется ошибка. Вот что я использовал:

public IEnumerable<IGrouping<string,int>> GetPosts()
    {
        var posts = from p in db.Posts
                    group p by p.Topic into topicCounts
                    select new
                    {
                        Topic = topicCounts.Key,
                        Count = topicCounts.Count()
                    };
        return posts.ToList();
    }

Это дает мне ошибку в posts.ToList (): Не удается неявно преобразовать тип 'System.Collections.Generic.List' в 'System.Collections.Generic.IEnumerable>'. Существует явное преобразование (вам не хватает приведения?)

Ответы [ 3 ]

3 голосов
/ 19 апреля 2011

Для создания группировки вы создаете анонимный тип, такой как:

var posts = from p in context.Posts
            group p by p.Topic into topicCounts
            select new
            {
                Topic = topicCounts.Key,
                Count = topicCounts.Count()
            };

Затем для работы с датой, скажем, итерируем по ней:

foreach(var p in posts)
{
    Response.Write(String.Format("{0} - {1}", p.Topic, p.Count));
}
1 голос
/ 19 апреля 2011

Вы должны создать новый тип, если вы делаете проекцию и возвращаете ей метод формы!

public class MyCounts
{
    public string Topic { get; set; }
    public int Count { get; set; }
}


public List<MyCounts> GetPopularTopics(int count)
{
    var posts = from p in db.Posts
                group p by p.Topic into myGroup
                select new MyCounts
                {
                    Topic = myGroup.Key,
                    Count = myGroup.Count()
                };
    return posts.ToList();
}
1 голос
/ 19 апреля 2011

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

Этот запрос создает IEnumerable из анонимных типов.

var posts = from p in context.Posts
        group p by p.Topic into topicCounts
        select new
        {
            Topic = topicCounts.Key,
            Count = topicCounts.Count()
        };

Это оператор select new, который создает анонимные объекты.

Что вам нужно сделать, это создать что-то, что не является анонимным, - объект, который можно использовать как внутри, так и вне этого метода.

Как это:

public IEnumerable<TopicAndCount> GetPosts()
{
    var posts = from p in context.Posts
        group p by p.Topic into topicCounts
        select new TopicAndCount
        {
            Topic = topicCounts.Key,
            Count = topicCounts.Count()
        };
 }

Обратите внимание на оператор select new TopicAndCount и возвращаемое значение метода включения.

Это решит вашу проблему.

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