Отдельные результаты linq по первой букве asp.net mvc 3 - PullRequest
2 голосов
/ 11 августа 2011

У меня есть запрос linq, который возвращает результаты, отсортированные по первой букве. Есть ли способ вернуть первое письмо перед группой, заказанной по этому письму? Например;

**A**
Acountants
Apothecary
**B**
Basketball
Biscuits

и так далее. Я пытался сгруппировать свои результаты так:

  var companyquery = (from c in db.Categories
                            group c by c.Name.Substring(0, 1)
                                into cgroup
                                select new
                                {
                                    FirstLetter = cgroup.Key,
                                    Names = cgroup

                                }).OrderBy(letter => letter.FirstLetter);

        return View(companyquery);

но получил ошибку:

"Элемент модели, передаваемый в словарь, имеет тип 'System.Data.Entity.Infrastructure.DbQuery 1[<>f__AnonymousType3 1 [System.String]]', но для этого словаря требуется элемент модели типа 'System.Collections. Generic.IEnumerable`1 [NewAtAClick.Models.Category] ''

Так что теперь я использую orderby вместо группы _ в _. Вот мой запрос;

   var companyquery = (from c in db.Categories
                            orderby c.Name.Substring(0, 1)
                            select c);

Возвращает их в алфавитном порядке. Я пытался сказать

     letter1 = companyquery.ToString().SubString(0,1)

тогда

     return view(letter1 + companyquery.ToList());

Но ничего.

Заранее спасибо!

Ответы [ 2 ]

6 голосов
/ 11 августа 2011

Ошибка говорит само за себя. Ваше представление ожидает модель типа IEnumerable<Category>, но вы передали что-то еще (в данном случае, потому что вы создаете новый анонимный тип посредством вызова select new { ... }).

Вместо этого вы можете объявить новый тип:

public class AlphabeticalMapping<T> {
    public char FirstLetter { get; set; }
    public List<T> Items { get; set; }
}

И измените ваш запрос на возвращение:

 var companyquery = (from c in db.Categories
                     group c by c.Name.Substring(0, 1)
                     into cgroup
                     select new AlphabeticalMapping<Category>() {
                         FirstLetter = cgroup.Key,
                         Items= cgroup.ToList()
                     }).OrderBy(mapping => mapping.FirstLetter);

И измени свой взгляд, чтобы ожидать IEnumerable<AlphabeticalMapping<Category>>

1 голос
/ 11 августа 2011

Что произойдет, если вы попробуете это?

var companyquery = (from c in db.Categories
                        group c by c.Name.Substring(0, 1)
                            into cgroup
                            select new, 
                            {
                                FirstLetter = cgroup.Key,
                                Names = cgroup

                            })
                            .OrderBy(letter => letter.FirstLetter)
                            .ToDictionary(k => k.FirstLetter, e => e.Names);
...