【问题标题】:Error : CS0029 Cannot implicitly convert type 'System.Collections.Generic.List<int>' to 'X'?错误:CS0029 无法将类型“System.Collections.Generic.List<int>”隐式转换为“X”?
【发布时间】:2020-10-04 01:08:35
【问题描述】:

我正在尝试将数据从 LocalDb 获取到我的 MVC 控制器中。我正在使用此代码但不起作用:

 public StatusCategory BranchIdSearch(string branch){
     var categoryId = _context.StatusCategories
         .Where(a => a.StatusCategoryTitle.Contains(branch))
         .Select(a => a.StatusCategoryId)
         .ToList();
     return categoryId;
 }

错误:

CS0029 无法将类型“System.Collections.Generic.List”隐式转换为“ProjectName.Data.Models.StatusCategory”

StatusCategory.cs 文件:

public class StatusCategory
{
    [Key]
    public int StatusCategoryId { get; set; }
    public string StatusCategoryTitle { get; set; }
    public virtual IEnumerable<Status> Status { get; set; }
}

LocalDb 表:

StatusCategory Table Structure

需要帮助,知道为什么它不起作用吗?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework asp.net-core ienumerable


    【解决方案1】:

    您正在检索 List&lt;int&gt; 而不是单个 StatusCategory。要检索单个对象或值,您必须使用FirstOrDefault。将您的查询更改为此以检索单个完整对象:

    var categoryId = _context.StatusCategories.Where(a => a.StatusCategoryTitle.Contains(branch))
         .FirstOrDefault();
    
     return categoryId;
    

    如果您真的只想要 Id,那么您必须更改返回类型和查询:

    public int BranchIdSearch(string branch){
     var categoryId = _context.StatusCategories.Where(a => a.StatusCategoryTitle.Contains(branch))
         .Select(a => a.StatusCategoryId)
         .FirstOrDefault();
     return categoryId;
    }
    

    【讨论】:

    • 最好返回 int? 并执行 FirstOrDefault()?.StatusCategoryId 以返回 null 不匹配而不是 0 这可能是一个有效的 id。
    • @juharr 数据库不会将“0”指定为有效的自动生成 ID,我习惯将“0”用作无效 ID。此外,您的建议将检索大量不需要的数据,如果表中每条记录包含大量数据,这将成为性能杀手。
    【解决方案2】:

    您选择的是List&lt;int&gt;,而不是单个StatusCategory

    您可以直接使用FirstOrDefaultSingle

    FirstOrDefault 将返回找到的对象或 null

    Single 将返回该对象或如果有多个符合条件的对象则抛出异常

     public StatusCategory BranchIdSearch(string branch){
         var categoryId = _context.StatusCategories.Where(a => a.StatusCategoryTitle.Contains(branch))
             .FirstOrDefault(a => a.StatusCategoryId);
    
         return categoryId;
     }
    
     public StatusCategory BranchIdSearch(string branch){
         var categoryId = _context.StatusCategories.Where(a => a.StatusCategoryTitle.Contains(branch))
             .Single(a => a.StatusCategoryId);
    
         return categoryId;
     }
    

    【讨论】:

    • Single 如果没有匹配项也会抛出。还有 SingleOrDefault 将返回 null 表示没有匹配项并抛出多个或 First 将返回第一个匹配项,或者如果没有匹配项则抛出。
    【解决方案3】:

    你试图返回许多,即一个列表,但你的函数说它应该返回一个。

    如果你想返回一个StatusCategory

    public StatusCategory BranchIdSearch(string branch){
        return _context.StatusCategories.FirstOrDefault(a => a.StatusCategoryTitle.Contains(branch));
    }
    

    如果你想回一个StatusCategoryId

    public int? BranchIdSearch(string branch){
        return _context.StatusCategories.Where(a => a.StatusCategoryTitle.Contains(branch)).Select(a => (int?)x.StatusCategoryId).FirstOrDefault();
    }
    

    如果要返回多个StatusCategory

    public IList<StatusCategory> BranchIdSearch(string branch){
        return _context.StatusCategories.Where(a => a.StatusCategoryTitle.Contains(branch)).ToList();
    }
    

    如果要返回多个StatusCategoryId

    public IList<int> BranchIdSearch(string branch){
        return _context.StatusCategories.Where(a => a.StatusCategoryTitle.Contains(branch)).Select(a => x.StatusCategoryId).ToList();
    }
    

    【讨论】:

    • 第二个应该返回int,因为它是StatusCategoryId的类型,同样第四个应该是IList&lt;int&gt;。虽然第二个可能应该是 int? 并且应该是 FirstOrDefault()?.StatusCategoryId 以便没有匹配返回 null 而不是 0 这可能是一个有效的 id。
    • @juharr 谢谢,我已经更新了我的答案。我一直认为 StatusCategoryId 是一个枚举,原因很奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 2019-10-03
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    相关资源
    最近更新 更多