Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用复合值从数据库中填充MVC下拉列表的最简洁的方法是什么?_C#_Asp.net Mvc_Entity Framework_Html.dropdownlistfor - Fatal编程技术网

C# 用复合值从数据库中填充MVC下拉列表的最简洁的方法是什么?

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的列表 通常我会尝试这样的方式:

我需要从数据库中填充dropdownlist,我正在寻找最简洁的方法

我已经让它工作了:

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
版本