[英]Retrieve single Entity Framework entities using a LINQ query or GetObjectKey?
[英]Query to entity framework 7 using linq and related entities
我有这个查询女巫工作正常:
List<IGrouping<Country, VisitedCity>> tempQuery = null;
using (var db = new MyDataContext())
{
tempQuery = db.VisitedCities.Include(c => c.PersonWhoVisited).Include(c => c.PersonWhoVisitedNationality).Include(c => c.City)
.GroupBy(c => c.PersonWhoVisitedNationality)
.ToList();
}
var dataInput = tempQuery
.OrderBy(c => c.Key.Name)
.Select(cp => new
{
CountryName = cp.Key.Name,
VisitationsByCity = cp
.GroupBy(x => x.City, x => x.CityId)
.Select(c => new
{
City = c.Key,
NumberOfVisits = c.Count()
})
}).ToList();
但是问题在于它正在将所有数据加载到我的应用程序中(我现在最大的表上已经有30万行),并且由于它全部加载到ToList()方法调用中而使其日趋缓慢。
我将其分为两个调用,因为我无法弄清楚如何对数据库进行单个调用并仅返回dataInput,如果将两个调用合并为一个,则会得到“对象引用未设置为对象实例”。 例题,这可能是因为未包含某些参考,但是我无法弄清楚查询中还包括哪些表...
我还在使用实体框架7,它仍然不支持延迟加载并且仍然缺少一些功能,但这应该可行吗? 在包括我尝试使用选择语句
.Include(c => c.LadiesInWaiting.Select(b => b.Princess))
就像在这里提到的那样: http : //blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx
但未被认可(因为其新的实体框架7?)
更新:好的,如果我使用.AsEnumerable,我可以在一个查询中完成所有操作,但是在下一次调用中加载数据似乎仍然需要大约6秒钟,并且在这种情况下还需要加载250 mb的内存。 ..
var tempQuery = db.VisitedCities.Include(c => c.PersonWhoVisitedNationality).Include(c => c.City)
.GroupBy(c => c.PersonWhoVisitedNationality)
.AsEnumerable()
.OrderBy(c => c.Key.Name)
.Select(cp => new
{
CountryName = cp.Key.Name,
VisitationsByCity = cp
.GroupBy(x => x.City, x => x.CityId)
.Select(c => new
{
City = c.Key,
NumberOfVisits = c.Count()
})
});
var allCities1 = tempQuery
.SelectMany(x => x.VisitationsByCity.Select(c => c.City))
.Distinct().OrderBy(city => city.Name).ToList();
好的,所以我设法将所有信息放在一个查询中,但是我仍然必须调用.ToList()才能使下一次数据检索工作,如果有人有更好的解决方案,请告诉我。
var dataInput = db.VisitedCities
.GroupBy(c => c.PersonWhoVisitedNationalityId)
.Join(db.Countries, s => s.Key, c => c.CountryId, (s, c) => new { s, c })
.OrderBy(c => c.c.Name)
.Select(cp => new
{
Country = cp.c,
VisitationsByCity = cp.s
.GroupBy(x => x.CityId)
.Join(db.Cities, s => s.Key, c => c.CityId, (s, c) => new { s, c })
.Select(c => new
{
City = c.c,
NumberOfVisits = c.s.Count()
})
}).ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.