私はこのコード スニペットで正しい行にいると確信していますが、私がやろうとしているのは、次のレコードと前のレコードに移動できるナビゲーション コントロールを使用してページに特定のレコードを表示することです (変更されたバージョンMVC3 で生成された [詳細] ビュー ページの)。
ページに移動すると、コードは ViewBag 変数を介して ActionLink ボタンを初期化し、対応するコントローラー内のこのメソッドで設定されます。
私の質問は、データベース レコードの範囲外に出る問題を防ぎながら、以下を実行するためのより良い方法はありますか?
public ViewResult Details(int id)
{
//Conditional Statements to manage navigation controls
if (db.tblQuoteLog.OrderByDescending(x => x.LogDate).Any(x => x.nID < id))
{
//Set value next button
ViewBag.NextID = id;
ViewBag.PreviousID = db.tblQuoteLog.OrderByDescending(x => x.LogDate).FirstOrDefault(x => x.nID > id).nID; //Inverted logic due to orderby
}
else if (db.tblQuoteLog.OrderByDescending(x => x.LogDate).Any(x => x.nID > id))
{
ViewBag.NextID = db.tblQuoteLog.OrderByDescending(x => x.LogDate).FirstOrDefault(x => x.nID < id).nID; //Inverted logic due to orderby
//Set value previous button
ViewBag.PreviousID = id;
}
else
{
//Set value next button
ViewBag.NextID = db.tblQuoteLog.OrderByDescending(x => x.LogDate).FirstOrDefault(x => x.nID < id).nID;
//Set value previous button
ViewBag.PreviousID = db.tblQuoteLog.OrderByDescending(x => x.LogDate).FirstOrDefault(x => x.nID > id).nID;
}
tblQuoteLog tblquotelog = db.tblQuoteLog.Find(id);
return View(db.tblQuoteLog.Where(x => x.nID == id).FirstOrDefault());
}
編集 マイクが与えたアイデアからうまくいくように見えるロジックに変更を加えました(きちんとしていないかもしれませんが、小さいです)。
//EOF is set to true if no records are found.
var nextRecord = (from r in db.tblQuoteLog
orderby r.Quote_ID descending
where r.Quote_ID < id
select new
{
Quote_ID = r.Quote_ID,
EOF = false
}).Take(1).
FirstOrDefault() ?? new { Quote_ID = id, EOF = true };
var previousRecord = (from r in db.tblQuoteLog
orderby r.Quote_ID ascending
where r.Quote_ID > id
select new
{
Quote_ID = r.Quote_ID,
EOF = false
}).Take(1).
FirstOrDefault() ?? new { Quote_ID = id, EOF = true };
//Conditional Statements to manage navigation controls
if ((nextRecord.EOF == true))
{
//Set value next button
ViewBag.NextID = id;
ViewBag.PreviousID = previousRecord.Quote_ID;
}
else if ((previousRecord.EOF == true))
{
ViewBag.NextID = nextRecord.Quote_ID;
//Set value previous button
ViewBag.PreviousID = id;
}
else
{
//Set value next button
ViewBag.NextID = nextRecord.Quote_ID;
//Set value previous button
ViewBag.PreviousID = previousRecord.Quote_ID;
}
匿名型を使用して、Linq クエリ内でエラー チェックが行われるようになりました。EOF (End of File) フラグを使用して、レコードが見つからない場合に ID が現在のレコードに設定され、EOF が true に設定されるようにします。
提案してくれてありがとう:)。