とすることができる。
のは、次のことを想定してみましょう:
サイズを開始するとのバランス、基礎となる表の周波数と更新頻度はそれがにそれをすべてをロードすることに全部を交換しても意味がないようなものである読みますメモリだけでそれを繰り返し見ている。
各IDに一致する行は1つだけです。
行には他の興味深いフィールドがたくさんありますが、ここでは気にしません。それはちょうど違うvar result = (from p in PrivilegeMap where p.PrivilegeActionId == actionID select new{p.ModeratorHasIt, p.AdminHasIt}).First()
と言えばvar result = PrivilegeMap.Where(p => p.PrivilegeActionId == actionID).First(p => new{p.ModeratorHasIt, p.AdminHasIt})
も書き込むことができます
var result = PrivilegeMap.Where(p => p.PrivilegeActionId == actionID).Select(p => new{p.ModeratorHasIt, p.AdminHasIt}).First()
if (myRole == User.Role.Admin)
{
return result.AdminHasIt;
}
if (myRole == User.Role.Moderator)
{
return result.ModeratorHasIt;
}
else
{
return false;
}
(:私たちはLinq2SQL Table<Privileges>
でPrivilegeMapを交換した場合
はその後、同等のLINQのコードのようなものになるだろう同じLINQ操作の構文)。
actionID
あなたのコードは、の線に沿ってSQLに変換されます2
あるとしましょう:
:上記privilegeActionId = 2
LINQのがになっられる特権FROM
SELECT * SELECT TOP 1 adminHasIt、moderatorHasIt FROM特権WHERE privilegeActionId
これがたくさんの列を持つ表であったかどうか、および/または一致する行が複数ある場合は、これはずっと効率的です。
(PrivilegeMapが列挙可能でしたが照会できない場合は、すべてがロードされスキャンされたため、まったく効率が悪い操作に変わります)。一方、そのSQLを生成するコードは複雑になる可能性があり、権限エンティティオブジェクトを設定する際にはいくつかの作業が必要です。これが一回限りの操作であれば、開発者効率やランタイム効率の面ではそれほど価値がないかもしれませんが、そうでなければ両方に利益をもたらす可能性があります。
ただし、両方のケースで不必要にクエリを実行しています。私は実際に地雷を交換したい:私たちはどんなデータベースの状態myRole
の他の値にfalseを保証しませんしているので、ちょうどadminHasIt、ちょうどmoderatorHasIt、またはのためのいずれかのクエリはまったく照会しません
if (myRole == User.Role.Admin) { return PrivilegeMap.Where(p => p.PrivilegeActionId == actionID).Select(p => p.AdminHasIt).First(); } if (myRole == User.Role.Moderator) { return PrivilegeMap.Where(p => p.PrivilegeActionId == actionID).Select(p => p.ModeratorHasIt); } else { return false; }
。
同様に、あなたがして非常に簡単な改善を得る:我々はない、おそらく、それを使用するだけで、我々は気にフィールドを変換し、行うことができない場合
if(myRole != User.Role.Admin && myRole != User.Role.Moderator)
return false;
DataRow[] result = PrivilegeMap.Select("privilegeActionId=" + (int)actionId);
if (myRole == User.Role.Admin)
{
return Convert.ToBoolean(result[0]["adminHasIt"]);
}
if (myRole == User.Role.Moderator)
{
return Convert.ToBoolean(result[0]["moderatorHasIt"]);
}
をここでは、最初の完全データベースクエリを避けます続いてboolをboolに変換します。実際にどのようなデータが使用されているかについてのこのようなローカルな考え方ははるかに簡単であり、そのような節約の大部分は小さく、大きなもの(潜在的に可能性があります)、複雑なトレードオフではなく習慣の問題です。
DataTableが 'Select'クエリに基づいてインデックスを管理していたので、私の答えは削除されました。 – Ani