давайте сделаем этот шаг за шагом, начиная с вашего исходного кода.
IQueryable - это выражение, которое вы создаете, запрос, если хотите. Это важное различие, это не фактические данные. Вы можете связать несколько условий в нем, поэтому возвращение IQueryable иногда полезно, поскольку это позволяет этому связыванию произойти.
Когда вы готовы выполнить выражение и получить фактические данные, это когда вы перечисляете, так что ваш ToList () в конце пойдет и выполнит запрос, вернет данные в том формате, который вы ожидаете, List, а не IQueryable
Конечно, на этом этапе ясно, что ваша конечная точка 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
на вашем месте я бы начал с простого, включил демонстрационный контроллер, убедился, что вы можете выполнить действия по умолчанию, затем измените его на свои, позаботьтесь о маршрутах, убедитесь, что они работают правильно.