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

时间:2010-01-15 16:01:52

标签: c# .net linq linq-to-sql linq-expressions

员工是一个样本实体类型。

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 个答案:

答案 0 :(得分:2)

我相信(假设_ctxDataContext),生成的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并查看:)

答案 1 :(得分:0)

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

请参阅What is the difference between IQueryable<T> and IEnumerable<T>?

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

答案 2 :(得分:0)

  1. 自使用IQueryable以来,它会过滤数据库中的记录。但是,对于r3
  2. ,@ Codeleuth可能是正确的
  3. 最漂亮的方式是_ctx.Employees.Skip(5).Take(5),因为除了SkipTakeFirst等方法调用之外,没有替代查询。

答案 3 :(得分:0)

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