我创建了一个SelectListHelper,以将所有下拉数据填充都放在一个中央位置。它将数据库中的行投影到IEnumerable<SelectListItem>
的集合中,这些视图可以由我的视图使用。这是课程的一部分:
public class SelectListHelper
{
private AppDbContext _db;
public SelectListHelper(AppDbContext db)
{
_db = db;
}
public IEnumerable<SelectListItem> GetCountries(bool showAll = false)
{
return _db.Set<Country>().Where(x => showAll || x.Enabled == true).OrderBy(x => x.Name).Select(x => new SelectListItem { Value = x.Abbreviation, Text = x.Name }).ToList();
}
public IEnumerable<SelectListItem> GetGoogleCategories(bool showAll = false)
{
return _db.Set<GoogleCategory>().Where(x => showAll || x.Enabled == true).OrderBy(x => x.Name).Select(x => new SelectListItem { Value = x.Name, Text = x.Name }).ToList();
}
}
GetCountries
,为简洁起见,省略了所有其他功能,一切正常。他们使用投影在Value
的Text
和SelectListItem
属性上的不同列。GetGoogleCategories
将Name
列投影到Value
的Text
和SelectListItem
属性上。这将产生以下SqlException:类型“ System.Data.SqlClient.SqlException”的异常发生在
Microsoft.EntityFrameworkCore.dll,但未在用户代码中处理
无效的列名“值”。
当我查看由
GetCountries
函数生成的SQL时,看起来就像我期望的那样:SELECT [x].[Abbreviation] AS [Value], [x].[Name] AS [Text]
FROM [Countries] AS [x]
WHERE [x].[Enabled] = 1
ORDER BY [Text]
但是,由
GetGoogleCategories
函数生成的SQL看起来并不像我期望的那样:SELECT [x].[Name] AS [Text]
FROM [GoogleCategories] AS [x]
WHERE [x].Enabled] = 1
ORDER BY [Value]
我在Visual Studio 2017(15.7.3)中使用EfCore 2.1.0。任何想法可能在这里发生什么?我可以通过返回一个名称数组并手动构建一个
SelectListItems
列表来解决此问题,但这使我担心数据访问层中的其他问题可能无法正常工作。public class GoogleCategory
{
[Key]
public int Id { get; set; }
[Required, StringLength(250)]
public string Name { get; set; }
public bool Enabled { get; set; } = true;
}
public class Country
{
[Key]
public int Id { get; set; }
[Required, StringLength(250)]
public string Name { get; set; }
[Required, StringLength(2)]
public string Abbreviation { get; set; }
public bool Enabled { get; set; } = true;
}
最佳答案
这是#12180: Invalid column name: orderby uses a column alias that does not exist跟踪的2.1回归错误。
针对特定情况的解决方法是将SelectListItem
构造函数与参数一起使用(2.1中引入的功能):
return _db.Set<GoogleCategory>()
.Where(x => showAll || x.Enabled == true)
.OrderBy(x => x.Name)
.Select(x => new SelectListItem(x.Name, x.Name) })
.ToList();
但当然仍然存在担忧。
关于c# - 使用相同的Value和Text属性的SelectListItem投影的EFCore SqlException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50876554/