最良のシナリオ (メタデータが必要な場合):
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() ... ) ...");