ユーザーがロールにあり、このロールに権限があり、クエリを実行する最速の方法を考えている権限システムを実装しています。
現時点では、次の LINQ クエリがあります。
var grant = db.Permissions.Any(p => p.Group == group && p.PermissionKey == permission
&& !p.Roles.Any(r => !r.IsAllowed && r.Role.Users.Any(u => u.UserName == user.Identity.Name))
&& p.Roles.Any(r => r.IsAllowed && r.Role.Users.Any(u => u.UserName == user.Identity.Name)));
return grant;
これには、EF がエンティティをキャッシュした後、約 1 ~ 2 ミリ秒かかります (初回は 15 ~ 20 ミリ秒)。これはそれほど遅くはありませんが、これは多くのクエリが実行される可能性があるため (たとえば、ユーザーがそのアイテムを表示できるかどうか、メニュー システムがすべてのアイテムをチェックするなど)、より高速な方法があるかどうかを尋ねています。
現時点で私が考えることができる唯一のことは、最初の呼び出しの後にクエリを完全に取り除くために User<->Permission キャッシュを作成することですが、キャッシュは常に私にとって最後の手段です (特にあなたが考える必要があるように)権限が変更された場合はクリアします)。
更新:Any
Marcinの提案どおりに使用しますが、高速ではありません...
更新 2:IsAllowed
をマッピング テーブルに移動し、 1 つだけを使用するようにクエリを調整しました...