2010-01-15 50 views
1

員工是一個示例實體類型。LINQ - 最小化返回記錄 - 正確寫出這些表達式的方式

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

寫一個只迭代一次的foreach循環?也許保留一個內部計數器。 – 2010-01-15 16:04:44

+0

你有遠程源嗎?!?! (LINQ to SQL) http://msdn.microsoft.com/en-us/library/bb399410.aspx – salgo60 2010-01-15 16:10:08

+0

salgo60,是的,現在是LINQ to SQL表達式。以後可能是LINQ to Entities。 – BuddyJoe 2010-01-15 16:18:04

回答

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看起來像它可能只是選擇所有,並採取最後一個記錄。

嘗試探查,看看:)

0
  1. 由於使用IQueryable它過濾數據庫中的記錄。但是,@Codesleuth可以正確對待r3
  2. 最漂亮的前瞻性的辦法是_ctx.Employees.Skip(5).Take(5),因爲沒有查詢替代的SkipTakeFirst
+0

r3的問題是什麼 – salgo60 2010-01-15 19:27:32

+0

正如@Codesleuth所說,'r3'看起來可能只是選擇全部並取最後一條記錄。 – 2010-02-01 13:18:32

0

你怎麼知道的最後一個記錄是什麼方法調用?什麼決定命令?你不能打電話給OrderByDescending,然後採取FirstOrDefault?也許這會產生更快的查詢。