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)
但没什么.
提前致谢!
错误说明了一切.您的视图需要一个类型的模型,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>>