首页 > 解决方案 > 试图返回最大日期

问题描述

我正在尝试获取最大日期年份值,但出现错误Results View: Expanding the Results View will enumerate the IEnumerable。还有什么我需要做的吗?

public int GetMeetingMaxYearBygroupId(int groupId)
        {
            using (var db = new NccnEcommerceEntities())
            {
                var q = from md in db.MeetingDates
                        join m in db.Meetings on md.MeetingId equals m.MeetingId
                        where (m.GroupId == groupId)
                        group md by md.StartDate into g
                        select new { Date = g.Max(t => t.StartDate) };

                int year = 2001;
                return year;

            }

        }

标签: entity-frameworklinq

解决方案


您可能会在调试器中看到此消息。这不是问题,或者更准确地说:如果你扩展它可能是一个问题,但通常不是。

IQueryable 和延迟执行

使用 LINQ 时,您必须知道有两组 LINQ 函数。那些不执行查询的,以及那些将获取数据并开始迭代的。

第一组 LINQ 方法,即不执行查询的方法,可以通过它们返回IQueryable<...>(或IEnumerable<...>)的事实来识别。人们常说这些方法使用延迟执行。在这些方法的描述中,您将始终看到它们使用延迟执行。这些 LINQ 方法的串联并不代表数据本身,它代表获取数据的潜力

连接这些 LINQ 方法并不是一项昂贵的操作。连接 IQueryables 只会改变 IQueryable 的表达式。未联系数据库,尚未获取任何数据。

另一组方法,不返回的方法IQueryable<...>将执行查询。这些 LINQ 函数内部经常使用 a foreach,或者如果效率更高,会使用 ifGetEnumerator()来获取枚举器,并反复调用MoveNext() and Current以访问数据。

GetEnumerator()将发送IQueryable.ExpressionIQueryable.Provider,后者将其转换为 SQL 并联系数据库以获取数据。获取的数据以 的形式返回给调用者IEnumerator<...>,因此调用者可以调用MoveNext() / Current来访问数据。

回到你的问题

在调试器中,您有时希望查看 IQueryable 表示的数据。该消息Expanding the Results View will enumerate the IEnumerable只是一个警告,如果您展开结果以查看数据,将联系数据库并获取数据。

除此之外,这可能需要一些时间,某些查询可能会更改其他数据,例如,如果您在查询数据时在某处登录。

所以通常看数据是没有问题的,尤其是在调试非生产数据的时候。请注意,如果您扩展数据,则可能会产生副作用。


推荐阅读