C# 可数可数
我有以下资料:C# 可数可数,c#,linq,iqueryable,C#,Linq,Iqueryable,我有以下资料: IQueryable<ViewAccountEntry> viewAccountEntries = db.AccountEntries .Where(x => x.DEntryID == 0) .Select(x => new ViewAccountEntry() { AccountEntry = x, DAccountEntries = db.AccountEntries .
IQueryable<ViewAccountEntry> viewAccountEntries = db.AccountEntries
.Where(x => x.DEntryID == 0)
.Select(x => new ViewAccountEntry()
{
AccountEntry = x,
DAccountEntries = db.AccountEntries
.Where(y => y.DEntryID == 0
&& y.Amount == -x.Amount
&& y.DateEntry == x.DateEntry)
.ToList()
});
Pages = new PageInfo(viewAccountEntries.Count(), page);
ViewAccountEntries = viewAccountEntries
.OrderBy(x => x.AccountEntry.DateEntry)
.Skip(Pages.ItemsSkipped)
.Take(Pages.ItemsPerPage)
.ToList();
IQueryable viewAccountEntries=db.AccountEntries
.其中(x=>x.DEntryID==0)
.Select(x=>newviewcountentry()
{
AccountEntry=x,
DAccountEntries=db.AccountEntries
.其中(y=>y.DEntryID==0
&&y.金额==-x.金额
&&y.DateEntry==x.DateEntry)
托利斯先生()
});
Pages=新页面信息(viewAccountEntries.Count(),第页);
ViewAccountEntries=ViewAccountEntries
.OrderBy(x=>x.AccountEntry.DateEntry)
.跳过(页面.项目跳过)
.Take(Pages.ItemsPerPage)
.ToList();
在第一个Select()
当执行.Count()
时,它是否执行第二个Select
的提取?或者,它计算起来很智能,知道它不需要执行任何选择吗?只要您保持它的可查询性,并且不调用ToList()
,EF就足够智能,可以优化查询并防止对count()
查询进行任何实际选择。count()
变成了查询引擎知道的Count()
的最佳实现
数据库支持的查询引擎(如Entity Framework或Linq2SQL)通常会使用导致生成的SQL中使用的COUNT(*)
、COUNT(不同的某些字段)
或类似内容
其他linq实现也会尽可能地聪明。例如,如果对实现ICollection
或ICollection
的对象调用了Count
getter,linq to对象将调用它,而不是通过整个枚举进行枚举
一个给定的查询引擎在处理
Count()
的给定用法时,可能最终不得不循环遍历项的枚举,因为它无法找出更有效的方法。通常,您越是按照Linq的初始类型进行操作(例如,除非您需要,否则不要调用ToList()
,或者如果您可以不这样做的话,甚至不要调用AsEnumerable()
),引擎将做得越好,尽管有时会出现异常。记录正在执行的实际SQL(如果单凭这一点还不能给出答案,那么就分析数据库)然后自己找出答案。不知道该怎么做。现在是学习的好时机。你应该检查你编写的大多数LINQ查询的SQL(至少是任何复杂的查询)只是为了验证您的工作并确保幕后没有任何不可靠的事情发生。至于如何做,这将根据查询提供程序的不同而有所不同,但每个提供程序都会公开记录它的方法。在数据库端检查查询的详细执行计划也是如此;查找您的特定数据库。但是,我意识到我可以d创建第一个iQuery无法进行选择,稍后添加选择部分。感谢您的帮助。我正在Visual Studio下使用MDF。