C# LINQ-最小化返回的记录-写入这些表达式的正确方法

C# LINQ-最小化返回的记录-写入这些表达式的正确方法,c#,.net,linq,linq-to-sql,linq-expressions,C#,.net,Linq,Linq To Sql,Linq Expressions,Employee是一个示例实体类型 var r1 = (from c in _ctx select c).Skip(5).Take(5); // my intent is to pull the first record from the query var r2 = (from c in _ctx select c).FirstOrDefault<Employee>(); // my intent is to pull the last record from t

Employee是一个示例实体类型

var r1 = (from c in _ctx select c).Skip(5).Take(5);  

// my intent is to pull the first record from the query  
var r2 = (from c in _ctx select c).FirstOrDefault<Employee>();   

// my intent is to pull the last record from the query.
// any good way to ask for the result back in the reverse   
// order of the natural sort without specifing a field/property name?  
var r3 = (from c in _ctx select c).LastOrDefault<Employee>();  
这些是否会拉回整个记录对象,然后进行过滤? 写这些代码的最佳方法是什么,这样整行代码就是一个LINQ表达式?

我相信,假设ctx是一个DataContext,那么生成的SQL将有一定的效率

我可以建议您在运行这些代码时运行SQL Server Profiler吗

我认为r2的查询将是一个简单的SELECTTOP1语句

r1有机会通过以下方式提高效率:

SELECT TOP(5) [fields]
FROM (
       SELECT TOP (10) [fields]
       FROM [table]
       ORDER BY [identitycol] DESC
     )
r3看起来可能只是选择全部并获取最后一条记录


请尝试探查器并查看:

如果使用IQueryable,这意味着您将创建一个将在远程源中运行的表达式树

好书工具C3.0简而言之,LinqPad,LINQ正在运行

它过滤数据库中的记录,因为使用了IQueryable。然而,@codesluth在r3方面可能是正确的。 最漂亮的方法是_ctx.Employees.Skip5.Take5,因为除了Skip、Take、First等方法调用之外,没有其他查询选择。
你怎么知道最后一张唱片是什么?什么决定了顺序?你不能先打个电话到OrderByDescending,然后接受第一个命令吗?也许这会产生更快的查询。

编写一个只迭代一次的foreach循环?保留一个内部计数器。你有远程源吗?!?!LINQ to SQL salgo60,是的,现在这些是LINQ to SQL表达式。稍后可能是LINQ到实体。正如我在下面所说的,然后您将解释查询,并且与本地查询一样,您有一个延迟执行模型。loacal和intepreted的区别在于,当解释的查询被执行时,整个问题被视为一个单元,将遍历整个表达式树,然后执行。结果将作为一个序列产生……正如@codesluth所说,r3看起来可能只是选择了全部并获取最后一条记录。