如何使用LINQ to Entities导航多个关系?

时间:2009-02-20 14:44:05

标签: linq entity-framework

我刚刚开始使用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属性不存在。当我从数据库中读取模式时,有没有办法让设计者将这些属性添加到模型中?

3 个答案:

答案 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文件?