【问题标题】:Entity framework Query with Top keword on child table在子表上使用 Top 关键字的实体框架查询
【发布时间】:2017-08-07 07:20:30
【问题描述】:
 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 - 前 10 名城市
2 - 城市名称字段的条件

我正在使用实体框架 6

【问题讨论】:

  • 添加 Take 应该适用于 TOP(n) 查询:.Where(x => x.CountryID == 100 && x.CityName.StartsWith("A")).Take(10).ToList()
  • 我只想申请 Take on city 而不是学校或国家
  • CityName 是 City 表的字段
  • 如果您将&& x.City.CityName.Startwith("A")..... 添加到您的take 会发生什么?
  • @oerkelens - CityName 给出编译时错误。但它像 ctx.Cities.CityName 一样工作正常

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


【解决方案1】:

使用这样的东西:

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();

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

如果您需要任何说明或有任何问题,请告诉我

【讨论】:

    【解决方案2】:

    设置国家、学校和城市之间的导航属性关系,然后根据您要接收的匿名类型的数据选择一个结构,并让 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 个。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 2014-10-13
      • 2011-12-06
      相关资源
      最近更新 更多