C# LINQ-最小化返回的记录-写入这些表达式的正确方法
Employee是一个示例实体类型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
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看起来可能只是选择了全部并获取最后一条记录。