首页 > 解决方案 > 无法隐式转换 System.LINQ 存在显式转换您是否缺少演员表

问题描述

我目前正在尝试使用 API 搜索查询实现 TypeAhead 插件。下面的代码是我从 udemy 类 Mosh ( https://github.com/mosh-hamedani/vidly-mvc-5/blob/master/Vidly/Controllers/Api/CustomersController.cs ) 收到的代码片段。实施以下代码后,我收到错误

无法将类型“System.Linq.Iqueryable”隐式转换为 System.Data.Entity.DbSet”。存在显式转换(您是否缺少演员表)?

这发生在这行代码上

vmrsQuery = vmrsQuery.Where(c => c.Description.Contains(query));

有没有其他人有解决方法来让它正常运行?

public IHttpActionResult GetVMRS(string query = null)
    {

        var vmrsQuery = _context.VMRS;

        if (!String.IsNullOrWhiteSpace(query))
            vmrsQuery = vmrsQuery.ToList().Where(c => c.Description.Contains(query));

        var vmrsDtos = vmrsQuery
            .ToList()
            .Select(Mapper.Map<VMRS, VMRSDto>);

        return Ok(vmrsDtos);
    }

标签: javascriptapimodel-view-controllertypeahead.js

解决方案


你不应该ToList()直接调用你的上下文。这将在执行 where 子句之前将数据库中的每一行都拉入内存。

vmrsQuery = vmrsQuery.ToList().Where(c => c.Description.Contains(query));

应该

vmrsQuery = vmrsQuery.Where(c => c.Description.Contains(query));

此外,您可能需要明确定义您的变量。

var vmrsQuery = _context.VMRS;

应该

IQueryable<VMRS> vmrsQuery = _context.VMRS;

这是因为如果使用实体框架,上下文可能是 DbSet。

你也可以把_context.VMRS.AsQueryable()


推荐阅读