C# 子表上具有Top keword的实体框架查询

C# 子表上具有Top keword的实体框架查询,c#,sql,asp.net,entity-framework,C#,Sql,Asp.net,Entity Framework,1-前10名网站 2-城市名称字段上的何处条件 我使用的是Entity Framework 6使用如下内容: 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")

1-前10名网站
2-城市名称字段上的何处条件


我使用的是Entity Framework 6

使用如下内容:

 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();
我没有测试它,也许你会得到一些编译错误,因为我不知道你如何命名你的类


如果您需要任何澄清或有任何问题,请告诉我,使用以下方式:

 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();
我没有测试它,也许你会得到一些编译错误,因为我不知道你如何命名你的类


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

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

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();
这将为您提供一个结构,其中包含国家/地区参考和与每个国家/地区关联的最多10个城市的列表

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

如果一个国家有很多城市,装载这套成套设备可能是昂贵的,那么你可能想考虑把这些实体拆开,而不是把一个城市集合与一个国家联系起来,把城市当作一个顶级的实体,它恰好与国家有关系。(即城市映射
.HasRequired(x=>Country)。WithMany()
而不是映射
.HasMany(x=>x.Cities)。WithRequired(x=>x.Country)
国家。)


如果您想要多个国家/地区,这将通过使用GroupBy表达式在一定程度上改变查询,尽管它只会根据搜索条件返回至少有一个城市的国家/地区。

设置国家/地区、学校和学校之间的导航属性关系,然后,city根据要接收的数据选择一个结构,并将其转换为匿名类型,然后让EF处理查询组合

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();
这将为您提供一个结构,其中包含国家/地区参考和与每个国家/地区关联的最多10个城市的列表

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

如果一个国家有很多城市,装载这套成套设备可能是昂贵的,那么你可能想考虑把这些实体拆开,而不是把一个城市集合与一个国家联系起来,把城市当作一个顶级的实体,它恰好与国家有关系。(即城市映射
.HasRequired(x=>Country)。WithMany()
而不是映射
.HasMany(x=>x.Cities)。WithRequired(x=>x.Country)
国家。)


如果您想要一个以上的国家,这将通过使用GroupBy表达式在一定程度上改变查询,尽管它只会根据搜索条件返回至少有一个城市的国家。

添加
Take
应该适用于TOP(n)查询:
。其中(x=>x.CountryID==100&&x.CityName.StartsWith(“a”)。Take(10)。ToList()
。我只想申请城市而不是学校或国家。ScityName是城市表的字段。如果将
和&x.City.CityName.Startwith(“A”)…
添加到
Take
?@oerkelens-CityName会出现编译时错误。但它的工作原理与ctx.Cities.CityNameAdding
Take
应该适用于TOP(n)查询:
。Where(x=>x.CountryID==100&&x.CityName.StartsWith(“A”)。Take(10).ToList()
。我只想应用Take on Cities而不是学校或国家。CityName是City表的字段。如果添加
和&x.City.CityName.Startwith(“A”)会发生什么..…
到您的
获取
?@oerkelens-CityName给出编译时错误。但它可以像ctx.Cities.CityName一样正常工作