10

私のテーブルは 3 つの列 (sno、name、age) で構成されています。追加の列 (行番号) を使用してデータベースからこのテーブルを取得しています。次のコードを使用しました。

select * from (
    select ROW_NUMBER() over (order by SNo asc)as rowindex,SNo,Name,Age 
    from tblExample) 
    as example where rowindex between ((pageindex*10)+1) and ((pageindex+1)*10)

pageindex は、ユーザーから渡される整数値を取る変数であることに注意してください。

私のデータベースは Sql Server 2008 です。Linq を使用して同じクエリを作成したいと考えています。それ、どうやったら出来るの?

4

3 に答える 3

7

以下のようにクエリを書くことができます

var index=1;
var pageIndex=1;
var pageSize = 10;
data.Select(x => new
{
    RowIndex = index++,
    Sno = x.Sno,
    Name = x.Name,
    Age = x.Age
}).OrderBy(x => x.Name)
.Skip(pageSize * (pageIndex - 1)).Take(pageSize).ToList();
于 2013-07-22T13:11:26.350 に答える
7

直訳ではありませんが、行番号はページングにのみ使用されているように見えるため、次を試してください。

db.tblExample
  .OrderBy(t => t.SNo)
  .Select((t,i) => new {rowindex = i+1, t.SNo, t.Name, t.Age })
  .Skip(pageIndex * 10)
  .Take(10);

編集

Select((t,i) => ...)うまくいかない場合は、クエリを水和した後に追加してインデックス番号を合成してみてください。

db.tblExample
  .OrderBy(t => t.SNo)
  .Skip(pageIndex * 10)
  .Take(10)
  .AsEnumerable();
  .Select((t,i) => new {rowindex = (pageIndex*10)+i+1, t.SNo, t.Name, t.Age })

フィールドが SQL クエリから返されず、代わりにメンバー選択式によって追加されるという事実を除いて、同等の SQLで終了する必要があります。rowindex

于 2013-07-22T13:09:37.867 に答える
0

最良のシナリオ (メタデータが必要な場合):

var rows = db.tblExample           // database context
           .OrderBy(x => x.SNo)  // set an orderby
           .AsEnumerable()       // force query execution (now we have local dataset)
           .Select(x => new
           {
               rowindex = i,
               SNo = x.Sno,
               Name = x.Name,
               Age = x.Age
           });                   // now you have your original query

ここでの唯一の欠点は、このメタデータを取得するためにデータセット全体を取得する必要があることです。ただし、.Skip&を使用すると.Take、LINQ は自動的にそれを行番号に変換します (後でそのメタデータを使用することはできません)。例えば

var pageIndex = /* ??? */;
var rows = db.tblExample
           .OrderBy(x => x.SNo)
           .Skip(pageIndex * 10).Take(10);

次のようなものが得られるはずです:

SELECT [t1].[SNo] AS [SNo],
       [t1].[Name] AS [Name],
       [t1].[Age] AS [Age]
FROM (
  SELECT ROW_NUMBER() OVER (ORDER BY [t0].[tblExample], [t0].[SNo]) AS [ROW_NUMBER],
         [t0].[SNo],
         [t0].[Name],
         [t0].Age]
  FROM   [tblExample] AS [t0]
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]

そのため、row_numberは SQL 内で内部的に使用されますが、コード内でアクセスすることはできません。

この種のアクセスが本当に必要な場合は、クエリを手動でサーバーに送信する方がよい場合があります。この種のものでうまく機能するライブラリの 1 つがdapper-dot-netで、次のようになります。

class MyObject {
    public Int32 rowindex;
    public Int32 SNo;
    public String Name;
    publig Int32 Age;
}

/* build "connection" */

connection.Query<MyObject>("SELECT * FROM (SELECT ROW_NUMBER() ... ) ...");
于 2013-07-22T13:27:30.967 に答える