实体框架和Web API / REST - 加入列表属性

时间:2014-06-13 22:07:51

标签: c# entity-framework

我使用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.

我一直无法找到如何正确连接这些表/对象以返回人员列表的示例。任何人都可以告诉我结构的正确方法吗?

谢谢!

1 个答案:

答案 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;