You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用LINQ查询数据库时出现CS0266隐式转换错误

解决CS0266: 无法将IEnumerable隐式转换为ICollection的问题

这个错误的根源很明确:你的tenants变量一开始是ICollection<Tenant>类型(来自ApplicationUser.Tenants),但LINQ的Where()方法返回的是IEnumerable<Tenant>,而C#不允许把更抽象的IEnumerable隐式转换为更具体的ICollection——虽然ICollection继承自IEnumerable,但转换方向不对。

这里有两种简单的修复方式:

方法1:将筛选结果转为List(最直接)

修改控制器里的筛选代码,在Where()后面调用ToList(),把IEnumerable<Tenant>转为List<Tenant>(而List<T>实现了ICollection<T>):

if (!String.IsNullOrEmpty(searchString)) {
    tenants = tenants.Where(t => t.FirstName.Contains(searchString)).ToList();
}

方法2:一开始就将变量声明为IEnumerable

如果后续不需要ICollection的特定方法(比如Add/Remove),可以直接把tenants的类型声明为IEnumerable<Tenant>,这样后续赋值Where()的结果就不会有类型问题:

public IActionResult Index(string searchString)
{
    var userId = _userManager.GetUserId(User);
    IEnumerable<Tenant> tenants = _context.Users.Include(usr => usr.Tenants)
        .Single(usr => usr.Id == userId)
        .Tenants;

    if (!String.IsNullOrEmpty(searchString)) {
        tenants = tenants.Where(t => t.FirstName.Contains(searchString));
    }
    return View(tenants);
}

补充说明

因为你已经通过Single()从数据库加载了当前用户的所有租户到内存中,所以调用ToList()不会触发额外的数据库查询,只是把内存中的筛选结果转成List集合,完全没问题。

内容的提问来源于stack exchange,提问作者Michael Henderson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:08:59