本番環境ではこのクエリが非常に遅いです。私は理由を知りたいし、同じ結果を達成するためのよりよい方法があるかどうかを知りたい。linq to SQLクエリが遅いのはなぜですか?
public async Task<Membership> FindByEmailByAccessL1OrL3OrL4Async(string email)
{
return await (from m in this.Queryable()
where m.Email == email
&& (m.RoleMemberships.Select(r => r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL1ID)
|| m.RoleMemberships.Select(r => r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL3ID)
|| m.RoleMemberships.Select(r => r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL4ID))
select m).SingleOrDefaultAsync();
}
つまり、このクエリの目的は、電子メールでユーザーのメンバーシップを取得し、ログインに進むことです。私はユーザーのメンバーシップを持っている以上、このクエリは遅くなります。
ありがとう、
デビッド
が編集
this.Queryable()
select * from Memberships
を実行するのと同じです。 Membership
テーブルには多数のロールがあり、ロールには多数のメンバーシップがあります。
また、メンバシップテーブルは、240行のログイン情報を取得するのに最大12秒かかります。電子メールの値はシステム内で一意ではないので、ロールでフィルタリングする必要があります。一部のロールのみがログインにアクセスでき、これらのロールには固有の電子メールが設定されます。これが私がフィルタリングしなければならない理由です。このクエリは、上記のクエリで選択されたログインに進むために1つのメンバシップを返します。だからIQueryable
,IEnumerable
またはList
、ちょうどSingleOrDefault
の値。
'this.Queryable()' ???あなたは多くの情報を提供していない.. 'これは何ですか? 'Queryable()'メソッドは何を返しますか?そのコードを表示しますか? – user3185569
申し訳ありません!このコードはリポジトリアーキテクチャ内にあります。私は編集セクションでさらに情報を与えました。 –
おそらく、SQLテーブル定義とインデックスの両方を参照する必要があります。 – RBarryYoung