我使用EF(Code First,.NET Framework 4.5)创建了一个Web API应用程序,并且我有一个类可以链接其他两个类,例如一个人和一个汽车,以便跟踪特定年份这个人的车。这允许在Cars表中每个Make / Model只需要一个条目,并且一个人可以拥有任何Make / Model of car的多个实例。它看起来像这样:
public class Person
{
public int Id {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
public List<PersonCar> Cars {get; set;}
}
public class PersonCar
{
public int Id {get; set;}
public Car {get; set;}
public int Year {get; set;}
}
public class Car
{
public int Id {get; set}
public string Make {get; set;}
public string Model {get; set;}
}
我需要一个控制器来返回驱动特定Make / Model汽车的所有人员,但是我无法创建正确的查询来加入这些表。这是我尝试过的一个例子:
public IQueryable<Person> GetPersonsByCarId(int carId)
{
IQueryable<Person> Persons = db.Persons.Include(
p => p.Cars.Where(
c => c.Car.Id == carId)
.Select(c => c.Car));
return Persons;
}
我通过更改Where和Select语句的顺序尝试了几种变体,但始终获得包含此消息的异常:
The Include path expression must refer to a navigation property defined on the type. Use dotted paths for reference navigation properties and the Select operator for collection navigation properties.
我一直无法找到如何正确连接这些表/对象以返回人员列表的示例。任何人都可以告诉我结构的正确方法吗?
谢谢!
答案 0 :(得分:0)
使用Any()
扩展名返回boolean
,您可以在Where
子句中使用
IQueryable<Person> Persons = db.Persons
// you can also do .Include("Car") here if you need Car property eager-loaded
.Where(p => p.Cars.Any(c => c.Car.Id == carId));
return Persons;