在LINQ Where中访问外键

本文关键字:访问 LINQ Where | 更新日期: 2023-09-27 18:14:20

我有一个名为Driver的实体,为了获得一个Driver列表,我调用:

List<Driver> drivers = _context.Drivers.Select(x=>x);

Driver可以有详细信息,它们之间有一个外键,但是我不能这样做:

List<Driver> drivers = _context.Where(x=>x.id == id && x.Detail.id == detailId);

我怎么能得到我的外键属性在我的Where子句?

我使用的是Entity Framework 3.5

语句工作,虽然我不确定(x=>x)是必要的,我还没有真正编译它:

List<Driver> drivers = _context.Drivers.Select(x=>x);

问题是Driver实体与Detail有一个外部关系,Driver有一个DetailId列,这是Detail表的外键,因为我使用实体框架3.5,我无法到达Driver.Detail.IdDriver.DetailId。它们不会出现。我确实读了一些关于EF 3.5不包括外键,然后在EF 4有选择,但我现在在EF 3.5

我确实尝试做.Include("Detail"),但它给了我一些关于Detail not being a navigation property.的例外

在LINQ Where中访问外键

在您的案例中使用Include方法。参考MSDN

我不熟悉EF 3.5,但也许你可以这样处理它:

context.drivers.Where(x => x.Detail == 
     context.Details.FirstOrDefault(d => d.Id == detailId))

你不能做_context.Where(),因为_context不是IQueryable<Driver>

试试_context.Drivers.Where()

你最好的线索是你得到关于Detail 不是一个导航属性的错误信息;尝试添加一个到Driver实体-如果它是一个驱动程序:许多细节:

public virtual ICollection<Detail> Details { get; set; }

如果是1个driver: 1 detail:

public virtual Detail Detail { get; set; }

在.dbml中,你可以指定那些使用关联的;如果您从现有的数据库中导入模型,FK应该作为关联导入,但是如果它们没有(或者如果数据库没有定义它们),您总是可以手动添加它们。

使用导航属性,EF应该能够计算如下内容:

var driversWithDetails = _context.Drivers
                                 .Where(x => x.Id == id && x.Detail.Id == detailId)
                                 .Include (x => x.Detail).ToList();