在 LINQ 中访问外键在哪里?
Posted
技术标签:
【中文标题】在 LINQ 中访问外键在哪里?【英文标题】:Access foreign key in LINQ Where? 【发布时间】:2013-05-13 19:08:34 【问题描述】:我有一个名为 Driver 的实体,为了获取 Drivers 列表,我调用:
List<Driver> drivers = _context.Drivers.Select(x=>x);
驱动程序可以有详细信息,它们是它们之间的外键,但我不能这样做:
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 表的外键,因为我使用的是 Entity Framework 3.5,所以我可以不能到达Driver.Detail.Id
或Driver.DetailId
。他们不上来。我确实读过一些关于EF 3.5
的内容,不包括外键,然后可以在EF 4
中进行选择,但我现在在EF 3.5
上。
我确实尝试过.Include("Detail")
,但它给了我一些关于Detail not being a navigation property.
的例外
【问题讨论】:
我不明白这个问题。它不让你做什么?你的代码目前给你什么错误? 你的第二个 Linq 语句有什么问题? 你能展示你的Driver类吗? 那(你的第二行)实际上创建了正确的 SQL - 使用 EF 最直观的通常是正确的方法。你一定有其他东西不起作用。 @NSGaga - 我添加了一些细节。 【参考方案1】:在您的情况下使用Include
方法。参考MSDN
【讨论】:
【参考方案2】:我不熟悉 EF 3.5,但也许你可以这样解决它:
context.drivers.Where(x => x.Detail ==
context.Details.FirstOrDefault(d => d.Id == detailId))
【讨论】:
抱歉,我修复了一些代码。如果有帮助,我会添加更多细节。【参考方案3】:您不能使用_context.Where()
,因为_context
不是IQueryable<Driver>
。
改用_context.Drivers.Where()
。
您最好的线索是您收到的关于Detail
的错误消息不是导航属性;尝试将一个添加到 Driver
实体 - 如果它是 1 个驱动程序:许多细节:
public virtual ICollection<Detail> Details get; set;
如果是 1 个驱动程序:1 个详细信息:
public virtual Detail Detail get; set;
在 .dbml 中,您可以使用 关联 指定那些;如果您从现有数据库导入模型,则 FK 应该作为 associations 导入,但如果它们没有(或者如果数据库没有定义它们),您可以随时手动添加它们。
使用导航属性,EF 应该能够评估如下内容:
var driversWithDetails = _context.Drivers
.Where(x => x.Id == id && x.Detail.Id == detailId)
.Include (x => x.Detail).ToList();
【讨论】:
我认为public virtual Detail
/ ICollection<Detail>
部分仅适用于 EF 4.1 代码优先。对于 EF 3.5,我相信这一切都在 .dbml 中。以上是关于在 LINQ 中访问外键在哪里?的主要内容,如果未能解决你的问题,请参考以下文章