繁体   English   中英

使用linq和相关实体查询实体框架7

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM