在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.Id
或Driver.DetailId
。它们不会出现。我确实读了一些关于EF 3.5
不包括外键,然后在EF 4
有选择,但我现在在EF 3.5
。
我确实尝试做.Include("Detail")
,但它给了我一些关于Detail not being a navigation property.
的例外
在您的案例中使用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();