代码之家  ›  专栏  ›  技术社区  ›  Brian Sullivan

如何使用Linq to Entities在多个关系中导航?

  •  3
  • Brian Sullivan  · 技术社区  · 17 年前

    我刚开始使用linq-to-entities,并尝试将我们当前在存储过程中所做的搜索复制为linq-to-entities查询。然而,我似乎找不到正确的方法来查询实体的属性,从我的查询起点开始,有不止一个“join”。

    例如,假设我有表campaign、campaign location和location,它们具有从campaign到campaign location和campaign location到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”属性。真奇怪,桌子上有一个叫这个的专栏。是否不在模型对象上,因为它是活动表的外键?

    我在这里哪里出了问题,我错过了什么?

    [更新]

    看起来我用于外键的任何整数列都不会作为模型对象的属性添加。将显示外键关系,但不存在ID属性。当我从数据库中读取模式时,有没有办法让设计器将这些属性添加到模型中?

    3 回复  |  直到 17 年前
        1
  •  1
  •   Quintin Robinson    17 年前

    属性只是表本身的一个实体引用,您是否在EF模型中为comaignlocation<->location定义了位置关系?然后,根据您实际尝试执行的操作(join等),我将考虑使用linq join语法、linq嵌套查询(可以形成一个join)或仅使用您最初拥有的过程。如果一开始有一个proc的目的,就把它放到ef模型中。

    编辑以更新:

    尝试打开模型并从数据库中为这些表刷新,列应该在那里,但是可以手动删除它们。即使有了这些列,您仍然需要自己在EFModel中定义关系。

        2
  •  0
  •   ctrlalt3nd    17 年前

    做这些工作吗?

        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 />");
        }
    

    (我怀疑您缺少外键或对象引用…)

        3
  •  0
  •   ctrlalt3nd    17 年前

    备选答案-如果在创建.edmx文件后更改了该数据库,则需要手动编辑/重新创建该文件?