entity-framework - 试图返回最大日期
问题描述
我正在尝试获取最大日期年份值,但出现错误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;
}
}
解决方案
您可能会在调试器中看到此消息。这不是问题,或者更准确地说:如果你扩展它可能是一个问题,但通常不是。
IQueryable 和延迟执行
使用 LINQ 时,您必须知道有两组 LINQ 函数。那些不执行查询的,以及那些将获取数据并开始迭代的。
第一组 LINQ 方法,即不执行查询的方法,可以通过它们返回IQueryable<...>
(或IEnumerable<...>
)的事实来识别。人们常说这些方法使用延迟执行。在这些方法的描述中,您将始终看到它们使用延迟执行。这些 LINQ 方法的串联并不代表数据本身,它代表获取数据的潜力。
连接这些 LINQ 方法并不是一项昂贵的操作。连接 IQueryables 只会改变 IQueryable 的表达式。未联系数据库,尚未获取任何数据。
另一组方法,不返回的方法IQueryable<...>
将执行查询。这些 LINQ 函数内部经常使用 a foreach
,或者如果效率更高,会使用 ifGetEnumerator()
来获取枚举器,并反复调用MoveNext() and Current
以访问数据。
GetEnumerator()
将发送IQueryable.Expression
给IQueryable.Provider
,后者将其转换为 SQL 并联系数据库以获取数据。获取的数据以 的形式返回给调用者IEnumerator<...>
,因此调用者可以调用MoveNext() / Current
来访问数据。
回到你的问题
在调试器中,您有时希望查看 IQueryable 表示的数据。该消息Expanding the Results View will enumerate the IEnumerable
只是一个警告,如果您展开结果以查看数据,将联系数据库并获取数据。
除此之外,这可能需要一些时间,某些查询可能会更改其他数据,例如,如果您在查询数据时在某处登录。
所以通常看数据是没有问题的,尤其是在调试非生产数据的时候。请注意,如果您扩展数据,则可能会产生副作用。
推荐阅读
- php - phpmailer 类中 base64_encode 中的警告
- bash - AWS Lightsail 自动备份 shell 脚本
- python - 具有多个消费者的 Pika 单队列
- node.js - MongoDB atlas 成本计算,以及如何节省成本
- python - 使用 cx_Oracle executemany 将 xls 数据插入 Oracle DB
- excel - 从错误文件复制宏
- php - PHP、PDO 和遗留数据库 - 动态更改字符集?
- php - 如何从不同的表中减去两个整数值
- sql - Oracle 提示 ORDERED 不起作用。如何强制加入订单?
- xml - Xml Spring批处理作业像if else一样执行