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。