我刚刚开始使用LINQ to Entities,我正在尝试将我们当前在存储过程中执行的搜索复制为LINQ to Entities查询。但是,我似乎无法找出正确的方法来查询实体的多个“加入”的查询属性。
例如,假设我有表Campaign,CampaignLocation和Location,它们具有从Campaign到CampaignLocation的外键,以及CampaignLocation到Location。非常标准的多对多表配置。当我开始编写这样的LINQ查询时:
var campaigns = from c in context.Campaign.CampaignLocation
这就像我可以走的那样在协会链中。 “CampaignLocation”似乎没有“Location”属性,因此我可以过滤该位置的属性。
我尝试使用LINQ连接语法,如下所示:
var campaigns = from c in context.Campaign
join cl in context.CampaignLocation
on c.CampaignID equals cl.CampaignID
但“cl”别名似乎没有“CampaignID”属性。这真的很奇怪,桌子上有一个名为the column的列。它不在模型对象上,因为它是Campaign表的外键吗?
我在哪里错了,我错过了什么?
[UPDATE]
看起来我用于外键的任何整数列都不会被添加为模型对象的属性。显示外键关系,但ID属性不存在。当我从数据库中读取模式时,有没有办法让设计者将这些属性添加到模型中?
答案 0 :(得分:1)
该属性只是表本身的实体引用,您是否在EF模型中为ComaignLocation< - > Location定义了Location关系?然后取决于你实际上想要做什么(加入等)。我会考虑使用linq连接语法,linq嵌套查询(可以形成连接)或只使用你原来的proc。如果首先有一个proc的目的,那就把它拉到你的EF模型中。
编辑更新:
尝试打开模型并从DB刷新这些表,列应该在那里,但是可以手动删除它们。即使列已就位,您仍然需要在EFModel中自己定义关系。
答案 1 :(得分:0)
这些工作吗?
Campaign campaign1 = context.Campaigns.Where(x => x.CampaignID == 1).Single();
foreach (CampaignLocation campaignlocation in campaign1.CampaignLocations)
{
Response.Write(campaignlocation.Location.Name + "<br />");
}
Location location1 = context.Locations.Where(x => x.LocationID == 3).Single();
foreach (CampaignLocation campaignlocation in location1.CampaignLocations)
{
Response.Write(campaignlocation.Campaign.Name + "<br />");
}
(我怀疑你错过了外键或对象引用......)
答案 2 :(得分:0)
备选答案 - 如果您在创建数据库后更改了数据库,则需要手动编辑/重新创建.edmx文件?