2

SQL Server テーブル (名前で並べ替え) に次のデータがあるとします。

Id   Name        LName
-------------------------
5   Abbas        Dayyan
3   Mohammad     KD
4   Nima         Ahmad
1   Omid         Zangene
2   Pedram       Ahmadi

Id クエリ文字列があり、Id から次の行と前の行 (存在する場合) を取得します。

例:

Id クエリ文字列は 4 なので、Mohammad KDを前の行として取得し、Omid Zangeneを次の行として取得します。

LINQ to Entity Framework でそれを行う方法を教えてください。

編集:
実際には、テーブルの行数は約 100 万です。
表の行は、デフォルトでは名前でソートされませんでした。結果を得るには、名前でソートする必要があります。

4

2 に答える 2

6

これはどう?

var result = (from person in db.People
              where person.Id == id
              let ordered = db.People.OrderBy(p => p.Name)                  
              let reversed = db.People.OrderByDescending(p => p.Name)                  
              let previous = reversed.SkipWhile(p => p.Id != id).Skip(1).FirstOrDefault()
              let next = ordered.SkipWhile(p => p.Id != id).Skip(1).FirstOrDefault()
              select new { previous, next }).First();

編集:新しい仕様を考慮に入れました。

編集 2:コードを not useLastOrDefaultに変更しました。これは LINQ to Entities では機能しません。

于 2012-09-30T20:53:57.243 に答える
1

これを試して:

 int id = 4;     
 var list = (from x in ctx.Table
            where x.id >= id - 1 && x.id <= id + 1
            select x).OrderBy(o -> o.name).ToList();

編集:これはID 3、4、および5の要素を返します。実際にデータベース内のテーブルを名前で注文しているかどうかはわかりませんが、そうであれば、linqを使用する代わりにループを使用する方が簡単だと思います前と次の要素を取得します。

更新:結果を名前でソートしました

于 2012-09-30T20:56:02.273 に答える