1

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 表达式的最佳方法是什么?

4

4 回答 4

2

我相信(假设_ctx是 a DataContext)生成的 SQL 会稍微有效。

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

我认为查询r2将是一个简单的SELECT TOP (1)语句。

r1有机会提高效率:

SELECT TOP(5) [fields]
FROM (
       SELECT TOP (10) [fields]
       FROM [table]
       ORDER BY [identitycol] DESC
     )

r3看起来它可能只是全选并取最后一条记录。

试试 Profiler 看看 :)

于 2010-01-15T16:12:05.847 回答
0

你怎么知道最后的记录是什么?什么决定了顺序?你不能打电话给 OrderByDescending,然后接受 FirstOrDefault 吗?也许这会产生更快的查询。

于 2010-01-15T18:47:04.150 回答
0

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

请参阅IQueryable<T> 和 IEnumerable<T> 之间有什么区别?

好书工具 c# 3.0 in a NutShell,LinqPad, LINQ in Action

于 2010-01-15T16:14:05.037 回答
0
  1. 它过滤数据库中的记录,因为IQueryable它被使用。但是,@Codesleuth 可能是正确的r3
  2. 最漂亮的方式是_ctx.Employees.Skip(5).Take(5),因为没有查询替代方法调用Skip, Take,First等。
于 2010-01-15T16:51:13.667 回答