1

従業員はサンプル エンティティ タイプです。

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すると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すべてを選択して最後のレコードを取得するだけのようです。

プロファイラーを試してみてください:)

于 2010-01-15T16:12:05.847 に答える
0
  1. が使用されているため、データベース内のレコードをフィルタリングしますIQueryable。ただし、@Codesleuth はr3.
  2. 、、など_ctx.Employees.Skip(5).Take(5)のメソッド呼び出しに代わるクエリがないため、最も見栄えの良い方法は です。SkipTakeFirst
于 2010-01-15T16:51:13.667 に答える
0

IQueryable を使用する場合は、リモート ソースで実行される式ツリーを作成することを意味します

IQueryable<T> と IEnumerable<T> の違いは何ですか? を参照してください。

良い本のツール c# 3.0 in a NutShell、LinqPad、LINQ in Action

于 2010-01-15T16:14:05.037 に答える
0

最後のレコードが何であるかをどうやって知るのですか? 順番は何で決まる?OrderByDescending を呼び出してから、FirstOrDefault を取得することはできませんか? おそらく、それはより速いクエリをもたらすでしょう。

于 2010-01-15T18:47:04.150 に答える