Entity framework 正在尝试返回最大日期
我试图获取“最大日期年”值,但得到的错误是“结果”视图:展开“结果”视图将枚举IEnumerable。我还有别的事要做吗Entity framework 正在尝试返回最大日期,entity-framework,linq,Entity Framework,Linq,我试图获取“最大日期年”值,但得到的错误是“结果”视图:展开“结果”视图将枚举IEnumerable。我还有别的事要做吗 public int GetMeetingMaxYearBygroupId(int groupId) { using (var db = new NccnEcommerceEntities()) { var q = from md in db.MeetingDates
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;
}
}
Results视图:展开Results视图将枚举IEnumerable
不是错误,它只是Visual Studio说明展开Results视图时会发生什么
据我所知,您需要在选择后首先执行
,
,将结果放入内存,否则每当您引用q
时,它将再次运行查询。您可能会在调试器中看到此消息。这不是一个问题,或者更确切地说:如果你扩展,它可能是一个问题,但通常不是
可延迟执行
使用LINQ时,您必须知道有两组LINQ函数。不执行查询的,以及将获取数据并开始迭代的
第一组LINQ方法,即不执行查询的方法,可以通过返回IQueryable
(或IEnumerable
)来识别。人们常说这些方法使用延迟执行。在对这些方法的描述中,您将始终看到它们使用延迟执行。这些LINQ方法的串联并不表示数据本身,它表示获取数据的可能性
连接这些LINQ方法并不是一个昂贵的操作。连接iQueryTables只会更改iQueryTable的表达式。未联系数据库,尚未获取任何数据
另一组方法,即不返回IQueryable
的方法将执行查询。这些LINQ函数通常在内部使用foreach
,或者如果它更有效,if将使用GetEnumerator()
获取枚举数,并重复调用MoveNext()和Current
访问数据
GetEnumerator()
将IQueryable.Expression
发送给IQueryable.Provider
,后者将其转换为SQL并联系数据库获取数据。获取的数据作为IEnumerator
返回给调用者,因此调用者可以调用MoveNext()/Current
来访问数据
回到你的问题上来
在调试器中,您有时希望看到IQueryable表示的数据。消息展开结果视图将枚举IEnumerable
只是一个警告,如果展开结果以查看数据,将联系数据库并获取数据
除此之外,这可能需要一些时间,一些查询可能会更改其他数据,例如,如果您在查询数据时登录到某个位置
因此,查看数据通常不是问题,特别是在调试非生产数据期间。请注意,如果展开数据,可能会有副作用。听起来像是在“调试”视图中单击结果。这只是告诉你上面写的表达式还没有执行。上面的表达式是一个IQueryable,尚未计算。您的代码有一些错误-您正在按
md.StartDate
分组,这意味着每个组g
将具有相同的StartDate
,那么您为什么要使用Max()
?分组的目的是什么?您能更好地解释一下您实际想要的“最大日期年值”是什么吗?它是单个值吗?这是一个值列表吗?我只是想得到一个值的最大开始日期值