C# 用复合值从数据库中填充MVC下拉列表的最简洁的方法是什么?
我需要从数据库中填充dropdownlist,我正在寻找最简洁的方法 我已经让它工作了:C# 用复合值从数据库中填充MVC下拉列表的最简洁的方法是什么?,c#,asp.net-mvc,entity-framework,html.dropdownlistfor,C#,Asp.net Mvc,Entity Framework,Html.dropdownlistfor,我需要从数据库中填充dropdownlist,我正在寻找最简洁的方法 我已经让它工作了: viewModel.CrewList = db.Crew.AsNoTracking().Select(x => new SelectListItem { Value = x.CrewID, Text = x.FirstName + " " + x.LastName }).ToList(); 我觉得这有点冗长,我不太喜欢SelectListItems的列表 通常我会尝试这样的方式:
viewModel.CrewList = db.Crew.AsNoTracking().Select(x => new
SelectListItem
{
Value = x.CrewID,
Text = x.FirstName + " " + x.LastName
}).ToList();
我觉得这有点冗长,我不太喜欢SelectListItems的列表
通常我会尝试这样的方式:
viewModel.CrewList = new SelectList(db.Crew.ToList(), "CrewId", "Name");
但是,当我尝试使用复合值时,它会出错:
viewModel.CrewList = new SelectList(db.Crew.ToList(), "CrewId", "FirstName + ' ' + LastName");
此选项还会在下拉列表中产生奇怪的结果(对于anon对象和SelectListItems):
将来做这件事最好的方法是什么
将来做这件事最好的方法是什么
但说真的,重要的是不要加载整个表来填充列表,其他两个方法都是通过调用db.Crew.ToList()来完成的
如果要避免选择SelectListItems,可以将匿名类型的集合传递给SelectList。乙二醇
new SelectList(db.Crew.Select( c => new {c.CrewId, Name=c.FirstName + " " + x.LastName}).ToList());
很容易重构为
db.Crew.Select( c => new {c.CrewId, Name=c.FirstName + " " + x.LastName} ).ToSelectList();
或
使用简单的扩展方法,如
public static SelectList ToSelectList<T,W>(this DbSet<T> dbSet, Expression<Func<T,W>> selector) where T:class
{
return new SelectList(dbSet.AsNoTracking().Select(selector).AsEnumerable());
}
publicstaticselectlist到SelectList(这个DbSet,表达式选择器),其中T:class
{
返回新的SelectList(dbSet.AsNoTracking().Select(selector.AsEnumerable());
}
或异步
public static async Task<SelectList> ToSelectListAsync<T, W>(this DbSet<T> dbSet, Expression<Func<T, W>> selector) where T : class
{
var results = await dbSet.AsNoTracking().Select(selector).ToListAsync();
return new SelectList(results);
}
公共静态异步任务ToSelectListAsync(此DbSet DbSet,表达式选择器),其中T:class
{
var results=await dbSet.AsNoTracking().Select(selector.toListSync();
返回新的SelectList(结果);
}
将来做这件事最好的方法是什么
但说真的,重要的是不要加载整个表来填充列表,其他两个方法都是通过调用db.Crew.ToList()来完成的
如果要避免选择SelectListItems,可以将匿名类型的集合传递给SelectList。乙二醇
new SelectList(db.Crew.Select( c => new {c.CrewId, Name=c.FirstName + " " + x.LastName}).ToList());
很容易重构为
db.Crew.Select( c => new {c.CrewId, Name=c.FirstName + " " + x.LastName} ).ToSelectList();
或
使用简单的扩展方法,如
public static SelectList ToSelectList<T,W>(this DbSet<T> dbSet, Expression<Func<T,W>> selector) where T:class
{
return new SelectList(dbSet.AsNoTracking().Select(selector).AsEnumerable());
}
publicstaticselectlist到SelectList(这个DbSet,表达式选择器),其中T:class
{
返回新的SelectList(dbSet.AsNoTracking().Select(selector.AsEnumerable());
}
或异步
public static async Task<SelectList> ToSelectListAsync<T, W>(this DbSet<T> dbSet, Expression<Func<T, W>> selector) where T : class
{
var results = await dbSet.AsNoTracking().Select(selector).ToListAsync();
return new SelectList(results);
}
公共静态异步任务ToSelectListAsync(此DbSet DbSet,表达式选择器),其中T:class
{
var results=await dbSet.AsNoTracking().Select(selector.toListSync();
返回新的SelectList(结果);
}
关于这个答案,我唯一不喜欢的是,考虑到ASP.NET MVC和实体框架的使用,应该使用方法的async
版本。关于这个答案,我唯一不喜欢的是,考虑到ASP.NET MVC和实体框架的使用,应该使用方法的async
版本