【问题标题】:LINQ Join with EF Navigation Property带有 EF 导航属性的 LINQ 连接
【发布时间】:2014-03-21 05:30:16
【问题描述】:

我已经阅读了很多关于如何在 LINQ 连接语句中使用实体框架导航属性的内容,但我仍然遇到问题。我可以让它在 Where 子句中工作,但不能作为连接。

如果我的交叉引用表存在于 EF 中并且不仅仅是一个导航属性,我的 LINQ 将如下所示:

var status = (from a in context.Beamtime_Request_Statuses
              join b in context.Proposal_Types_Beamtime_Request_Statuses on a.Status equals b.Beamtime_Request_Status
              where b.Proposal_Type_ID == proposalTypeID && a.Order > currentStatusOrder
              orderby a.Order
              select a.Status).FirstOrDefault();

所以问题是表 Proposal_Types_Beamtime_Request_Statuses 没有成为实体,只是一个导航属性,因为该表只包含 Proposal_Type_ID 和 Beamtime_Request_Status 列,它们都是其他表的主键和该表中的外键。

如果有人能告诉我如何使用适当的符号和 Proposal_Types_Beamtime_Request_Statuses 作为导航属性来编写该 LINQ 语句,那将不胜感激。

【问题讨论】:

  • 所以Beamtime_Request_Status 有一个属性Proposal_Types
  • 是的,Beamtime_Request_Statuses 的导航属性为 Proposal_Types,Proposal_Types 的导航属性为 Beamtime_Request_Statuses。

标签: asp.net-mvc linq entity-framework


【解决方案1】:

您与纯联结表(只有两个外键,都包含表的主键)具有多对多关联。默认情况下,Entity Framework 不会将此类表映射到类。您可以这样保留它并像这样查询多对多关联:

from a in context.Beamtime_Request_Statuses
where a.Proposal_Types.Any(pt => pt.Proposal_Type_ID == proposalTypeID)
   && a.Order ... (rest of the query)

(假设Beamtime_Request_Status 有一个属性Proposal_Types,EF 会默认创建。)

或者您可以强制 EF 将表映射为一个类。 Here's 一种应该有效的方法。您还可以向联结表添加一列,从数据库中更新模型并再次删除该列(或者如果它恰好是有用的列,则将其保留在那里)。

【讨论】:

  • 谢谢!因此,如果交叉引用表实际上可用作实体,则 where 子句实质上复制了连接将执行的操作。
  • 是的,您会在检查生成的 SQL 时看到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
相关资源
最近更新 更多