次のメソッドを使用して、Personテーブル内のユーザーにフラグを付けて処理できるようにします。他のスレッドが同じ行で動作しないように、これらのユーザーには「処理中」のフラグを立てる必要があります。
SQL Management Studioでは、クエリは期待どおりに機能します。アプリケーションでメソッドを呼び出すと、その人の行を受け取りますが、ステータスは古いものです。
ステータスは、Person以外の多くのナビゲーションプロパティの1つであり、このクエリが返されるとき、プロキシオブジェクトとして返される唯一のプロパティです。
// This is how I'm calling it (obvious, I know)
var result = PersonLogic.GetPeopleWaitingInLine(100);
// And Here is my method.
public IList<Person> GetPeopleWaitingInLine(int count)
{
const string query =
@"UPDATE top(@count) PERSON
SET PERSON_STATUS_ID = @inProcessStatusId
OUTPUT INSERTED.PERSON_ID,
INSERTED.STATUS_ID
FROM PERSON
WHERE PERSON_STATUS_ID = @queuedStatusId";
var queuedStatusId = StatusLogic.GetStatus("Queued").Id;
var inProcessStatusId = StatusLogic.GetStatus("In Process").Id;
return Context.People.SqlQuery(query,
new SqlParameter("count", count),
new SqlParameter("queuedStateId", queuedStateId),
new SqlParameter("inProcessStateId", inProcessStateId)
}
// update | if I refresh the result set then I get the correct results
// but I'm not sure about this solution since it will require 2 DB calls
Context.ObjectContext().Refresh(RefreshMode.StoreWins, results);