单独的linq结果由第一个字母asp.net mvc 3

Dan*_*Dan 2 linq-to-entities sql-order-by asp.net-mvc-3

我有一个linq查询,它返回以第一个字母排序的结果.有没有办法在该信件订购的小组之前退回第一个字母?例如;

**A**
Acountants
Apothecary
**B**
Basketball
Biscuits
Run Code Online (Sandbox Code Playgroud)

等等.我试着像这样分组我的结果;

  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);
Run Code Online (Sandbox Code Playgroud)

但得到了错误:

"传递到字典中的模型项的类型为'System.Data.Entity.Infrastructure.DbQuery 1[<>f__AnonymousType31 [System.String]]',但此字典需要类型为'System.Collections.Generic.IEnumerable`1的模型项[ NewAtAClick.Models.Category] ''

所以现在我使用orderby而不是group _ into _.这是我的查询;

   var companyquery = (from c in db.Categories
                            orderby c.Name.Substring(0, 1)
                            select c);
Run Code Online (Sandbox Code Playgroud)

这将以阿尔卑斯的顺序返回它们.我试着说

     letter1 = companyquery.ToString().SubString(0,1)
Run Code Online (Sandbox Code Playgroud)

然后

     return view(letter1 + companyquery.ToList());
Run Code Online (Sandbox Code Playgroud)

但没什么.

提前致谢!

mar*_*ind 6

错误说明了一切.您的视图需要一个类型的模型,IEnumerable<Category>但是您传入了其他内容(在这种情况下,因为您通过调用创建了一个新的匿名类型select new { ... }).

相反,您可以声明一个新类型:

public class AlphabeticalMapping<T> {
    public char FirstLetter { get; set; }
    public List<T> Items { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并更改您的查询以返回:

 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);
Run Code Online (Sandbox Code Playgroud)

并改变你的观点 IEnumerable<AlphabeticalMapping<Category>>