实体框架在子表上使用Top keword进行查询

时间:2017-08-07 07:20:30

标签: c# sql asp.net entity-framework

 var countries= ctx.Country
                .Include("cities") // I want to take only 10 cities. How to take top 10 cities and city name starts from "A"
                .Include("Schools")            
                .Where(x => (x.CountryID == 100))
                .ToList();

1 - 十大ciites
2 - CityName字段的标准

我正在使用Entity Framework 6

2 个答案:

答案 0 :(得分:0)

使用类似的东西:

var countries = ctx.Country.Select( c => new { 
                        Country = c,
                        Cities = c.Cities.Where(ci = > ci.CityName.ToLower().Startwith("A".ToLower())).Take(10),
                        Schools = Cities.select(ci => ci.Schools)
                  }).Where(x => x.CountryID == 100).ToList();

我没有测试它,也许你会得到一些编译错误,因为我不知道你如何命名你的课程。

如果您需要任何澄清或有任何疑问,请与我们联系

答案 1 :(得分:0)

设置国家/地区,学校和城市之间的导航属性关系,然后根据您要接收的数据选择一个结构为匿名类型,让EF处理查询合成。

var countryData = ctx.Countries
  .Include(x => x.Schools)
  .Where(x => x.CountryID == 100)
  .Select(x => new { Country = x, Cities = x.Cities.OrderBy(c => c.CityName).Take(10).ToList() })
  .ToList(); // This likely only returns 1 row due to the CountryId Where Clause...

这将为您提供一个结构,其中包含国家/地区参考以及与每个国家/地区关联的最多10个城市的列表。

如果您在结果中的Country对象上访问Cities集合,您仍然会延迟加载所有城市,但上述语句中返回的.Cities集合将是您关注的10。

如果一个国家/地区有很多城市,并且加载此完整集可能会非常昂贵,那么您可能需要考虑让实体断开连接而不是将城市集合与某个国家/地区相关联,将城市视为顶级城市碰巧与国家有关系的实体。 (即城市映射.HasRequired(x=> Country).WithMany()而不是在国家/地区映射.HasMany(x=> x.Cities).WithRequired(x=>x.Country)。)

如果您想要多个国家/地区,通过使用GroupBy表达式,这会稍微更改查询,但它只返回根据搜索条件至少拥有一个城市的国家/地区。