员工是一个样本实体类型。
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表达式?
答案 0 :(得分:2)
我相信(假设_ctx
是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并查看:)
答案 1 :(得分:0)
如果您使用IQueryable意味着您创建将在远程源中运行的表达式树
请参阅What is the difference between IQueryable<T> and IEnumerable<T>?
NutShell中的好书工具c#3.0,LinqPad,LINQ in Action
答案 2 :(得分:0)
IQueryable
以来,它会过滤数据库中的记录。但是,对于r3
。_ctx.Employees.Skip(5).Take(5)
,因为除了Skip
,Take
,First
等方法调用之外,没有替代查询。答案 3 :(得分:0)
你怎么知道最后的记录是什么?什么决定了订单?你不能打电话给OrderByDescending然后拿FirstOrDefault吗?也许这会产生更快的查询。