使用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
相关产品推荐
相关产品推荐

