【问题标题】:Joining two tables in asp.net webapi 2在asp.net webapi 2中加入两个表
【发布时间】:2020-02-27 10:17:05
【问题描述】:

在asp.net webapi 2中加入两个表需要帮助

我有以下代码加入两个表

  public IQueryable<Employee> GetEmployees()
    {


        var q = (from n in db.Employees
                 join c in db.tblCities on n.ProjectID equals c.CityID

                 select new
                 {
                     n.Name,
                     n.Email,
                     c.CityName,

                 }).ToList();
        return q;

    }

但我得到这个错误

严重性代码描述项目文件行抑制状态 错误 CS0266 无法隐式转换类型 'System.Collections.Generic.List' 到 'System.Linq.IQueryable'。显式 存在转换(您是否缺少 投?)WebApplication15 C:\Users\admin\source\repos\WebApplication15\WebApplication15\Controllers\EmployeesController.cs 35 Active

员工模型

namespace WebApplication15
{
    using System;
    using System.Collections.Generic;

    public partial class DtscEmployee
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        public string Country { get; set; }
        public Nullable<int> ProjectID { get; set; }
        public string ManagerName { get; set; }
        public string ProfileImage { get; set; }

    }
}

城市模型

namespace WebApplication15
{
    using System;
    using System.Collections.Generic;

    public partial class tblCity
    {
        public int CityID { get; set; }
        public string CityName { get; set; }
    }
}

【问题讨论】:

  • 你的函数的返回类型是什么
  • 发布完整功能。最有可能的函数返回类型是 IQueryable 但你返回 q (它的类型是 Generic List)
  • 这是因为返回类型与list type 不同。函数返回类型是什么?
  • @BPDESILVA 我尝试将其作为 `IQueryable q = (from n in db.Employees` 并最后将 .ToList(); 替换为 ToList().AsQueryable(); return q ;
  • 删除 ToList() 对您没有帮助。您需要了解代码才能找到问题。您的 select new 创建了一个匿名对象,它不再是您的employee,因此您无法返回它。现在,你为什么要加入 Employee 和城市表。请记住,您使用的是对象而不是 SQL 表。因此,如果您的模型的设计方式使其具有对其子级的导航属性,那么您只需要返回“员工”。如果你是 EF 新手,请多阅读

标签: c# asp.net asp.net-web-api


【解决方案1】:

让我们从您的初始代码开始,一步一步来。

IQueryable 是您正在构建的表达式,如果需要,可以进行查询。这是一个重要的区别,它不是实际数据。您可以在其上链接多个条件,这就是为什么返回 IQueryable 有时很好,因为它允许这种链接发生。

当你准备好执行表达式并获取实际数据时,这是你枚举的时候,所以你最后的 ToList() 将去运行查询,以你期望的格式返回数据,List,不可查询

当然,此时明确的信息是您的 API 端点永远不应返回 IQueryable,因为它还不是数据。

所以,你的代码会变成这样:

public IHttpActionResult GetEmployees()
    {
        var query = (from n in db.Employees
                 join c in db.tblCities on n.ProjectID equals c.CityID

                 select new
                 {
                     n.Name,
                     n.Email,
                     c.CityName
                 });

       var employees = query.ToList();

       //some other things, maybe you want to return BadRequest if there are none or NotFound or whatever you deem appropriate
       return Ok(employees);           
    }

这里有一个很好的阅读:https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action-results

如果我是你,我会从简单开始,将演示控制器放入,确保你可以点击默认操作,然后用你自己的操作进行修改,处理好路由,确保它们正常工作。

【讨论】:

  • 非常感谢您运行良好,但我无法再从这里访问 api localhost:50511/api/employees
  • 我得到 The 'ObjectContent1' 类型无法序列化内容类型 'application/xml; 的响应正文; charset=utf-8'.` 尝试打开 api 时
猜你喜欢
  • 1970-01-01
  • 2019-09-01
  • 2021-06-26
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多