在LINQ中访问外键在哪里?

时间:2013-05-18 21:07:42

标签: c# linq entity-framework

我有一个名为Driver的实体,为了获得一个驱动程序列表,我打电话给:

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 =&gt; x)是否必要,但我实际上并没有编译它:

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

问题是Driver实体与Detail有外来关系,Driver有一个DetailId列,它是Detail表的外键,因为我我正在使用Entity Framework 3.5,我无法访问Driver.Detail.IdDriver.DetailId。他们没有出现。我确实读过关于EF 3.5不包括外键然后在EF 4中进行选择的内容,但我暂时在EF 3.5

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我不熟悉EF 3.5,但也许你可以像这样解决它:

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

答案 2 :(得分:0)

由于_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 导入,但如果它们没有(或者如果数据库没有定义它们),您可以随时手动添加它们。 / p>

使用导航属性,EF应该可以评估类似的内容:

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