2016-08-17 74 views
2

首先这是我在论坛中的第一个问题,所以请原谅我的任何写错误。使用实体框架从嵌套表中获取数据

我有4个表

attaching the table diagram

我想是让游乐设施名称的列表中加入“tblattraction”与“tblattractions”使用'tblattractionmaster“和每个地方的确切吸引力的数locationid”,我使用实体框架,但不知道该怎么做,

免责声明: 每个位置可以由多个地方 每个地方可以由多个景点

我已经试过

return context.tblLocationMasters.Select(t => new details() 
       { 
        locationid = t.LocationId, 
        locationname = t.LocationName, 
        attractions =t.tblPlaces.SelectMany(a => a.tblAttractions).Select(b => new attractions(){ 
         AttractionName=b.tblAttractionMaster.attractionname//(Not working), 
         TotalAttractions=0//??? 
        }).ToList() 
       }).ToList(); 
+1

欢迎!你的模型看起来是错误的。正如我推测看你的模型,你在tblattractions和tblattractionmaster之间有一种自我关系。您只能拥有一个带有“parentId”字段的Attraction表以获得此行为。 – jpgrassi

+0

@jpgrassi实际上“tbllocation”可以有多个地方,所以我首先使用“locationid”加入“tblPaces”和“tblLocation”,然后一个地点可以有多个景点,使用“placeId”连接“tblAttraction”和“tblPlaces”不希望在“tblAttraction”中存储“AttractionName”,因为它将被重复,所以“我将名称存储在名为”tblAttractionMaster“的主表中,并使用”attrMasterId“将”tblAttraction“与”tblAttractionMaster“结合起来。 – Nayak

+0

,基本上你想要LocationId,LocationName,在每个地方的吸引力计数(和名称)? – jpgrassi

回答

0

我重新使用的Code First模型(略有不同)。我想出了以下结构:

public class Location 
{ 
    public int LocationId { get; set; } 

    public string LocationName { get; set; } 

    public ICollection<Place> Places { get; set; } 
} 

public class Place 
{ 
    public int PlaceId { get; set; } 

    public string PlaceName { get; set; } 

    public int LocationId { get; set; } 

    public Location Location { get; set; } 

    public ICollection<AttractionPlace> Attractions { get; set; } 
} 

public class Attraction 
{ 
    public int AttractionId { get; set; } 

    public string AttractionName { get; set; } 
} 

public class AttractionPlace 
{ 
    public int AttractionPlaceId { get; set; } 

    public int PlaceId { get; set; } 

    public Place Place { get; set; } 

    public int AttractionId { get; set; } 

    public Attraction Attraction { get; set; } 
} 

然后,我能得到你需要用下面的查询方式的结果:

var query = (from loc in db.Locations 
      join pla in db.Places.Include(x => x.Attractions) on loc.LocationId equals pla.LocationId 
      let count = pla.Attractions.Count() 
      select new 
      { 
       loc.LocationId, 
       loc.LocationName, 
       Attractions = pla.Attractions.Select(z => new 
       { 
        pla.PlaceName, 
        z.AttractionId, 
        z.Attraction.AttractionName 
       }), 
       AttractionsByPlaceCount = count 
      }); 

以上的回报数据的查询在此format

只是一个侧面说明:我没有进一步看到这个查询的性能。 Linq生成的SQL并没有那么糟糕,但在生产中实际使用它之前,应该考虑分析它。

+0

太棒了,但我需要这样的东西http://pastebin.com/6CKM23QE – Nayak

+0

我想你想要的是错了,你说自己每个地方都有很多地方,每个地方都有许多景点,所以你可以得到地名,身份证和a其景点的总和,但没有吸引力和它的总和。说得通? – jpgrassi

+0

actaually当用户将选择一个国家,它将获得该国家的所有位置,并为我想要显示的每个位置显示位置名称和所有不同的景点与总数,例如用户将选择美国和我有两个地点为美国像纽约和芝加哥为纽约他们有3个地方为纽约例如:“a”和“b”和“a”有2个景点,如“x”,“y”和“b”有1个景点“x”,显示位置纽约我将显示名称为“纽约”,并将结合“a”和“b”两个地点的景点将显示不同的景点,例如数量为 – Nayak

相关问题