【问题标题】:Access foreign key in LINQ Where?在 LINQ 中访问外键在哪里?
【发布时间】: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.IdDriver.DetailId。他们不上来。我确实读过一些关于EF 3.5 的内容,不包括外键,然后可以在EF 4 中进行选择,但我现在在EF 3.5 上。

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

【问题讨论】:

  • 我不明白这个问题。它不让你做什么?你的代码目前给你什么错误?
  • 你的第二个 Linq 语句有什么问题?
  • 你能展示你的Driver类吗?
  • 那(你的第二行)实际上创建了正确的 SQL - 使用 EF 最直观的通常是正确的方法。你一定有其他东西不起作用。
  • @NSGaga - 我添加了一些细节。

标签: c# linq entity-framework


【解决方案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&lt;Driver&gt;

    改用_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&lt;Detail&gt; 部分仅适用于 EF 4.1 代码优先。对于 EF 3.5,我相信这一切都在 .dbml 中。
    猜你喜欢
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多