我已经阅读了很多关于如何在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语句,那将非常感激。
答案 0 :(得分: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一种应该有用的方法。您还可以向联结表添加一个列,从数据库更新模型并再次删除该列(如果它恰好是一个有用的列,则将其保留在那里)。