我创建了一个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,为简洁起见,省略了所有其他功能,一切正常。他们使用投影在ValueTextSelectListItem属性上的不同列。

GetGoogleCategoriesName列投影到ValueTextSelectListItem属性上。这将产生以下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/

10-12 00:39