1. EF.Functions.xxxを使用したクエリ
1.1 EF.Functions.Likeを使用したファジィ·クエリは、StartsWith、Contains、EndsWithメソッドで生成されたSQL文よりも優れたパフォーマンスを発揮します。
A.。Containsステートメント。生成されるSQLは次のとおりです。
var data3 = dbContext.T_UserInfor.Where(u => u.userName.Contains("p")).ToList();
Charindexを使う

B.。EF. Functions.Like文は次のようなSQLを生成します(SQLクエリのワイルドカード文字で使用します)。
var data1 = dbContext.T_UserInfor.Where(u => EF.Functions.Like(u.userName, "%p%")).ToList();
//或者
var data2 = (from p in dbContext.T_UserInfor
where EF.Functions.Like(p.userName, "%p%")
select p).ToList();
使用するのはLike

PS:在传统的.Net 中,还有种用法 SqlMethods,详见:https://www.cnblogs.com/yaopengfei/p/11805980.html
1.2.また、EF. Functions.DateDiffDay DateDiffHour、DateDiffMonthは、日、時間、月の数を求めます。
PS EF Coreでは、StartsWith、Contains、EndsWithの各クエリは、実際にはLikeではなくLeft、CharIndex、Rightに解決され、EF.Functions.LikeはLike文に解決されます。
详见:https://www.cnblogs.com/tdfblog/p/entity-framework-core-like-query.html
2. Z.EntityFramework.Plus.EFCore依存関係の追加特殊構文を使用
これは無料ですが、Z.EntityFramework.Plusの一部の一括データ操作パッケージは有料です。
- EFCoreの削除は、削除する前にクエリを実行する必要があります。最適化後に直接削除できます。
context.User.Where(t => t.Id == 100).Delete();
- 更新文の最適化
context.User.Where(t => t.Id == 4).Update(t =>new User() { NickName = "2224114" ,Phone = "1234"} );
3. FirstOrDefault t=> t.id =10の代わりに、Find id=10を正しく使用します。
Findはキャッシュを優先し、以前にこのデータをクエリした場合に使用します。FirstOrDefaultは毎回データベースをクエリします。id=10のデータが変更されると、findが検出するデータは新しいデータです。
4. エンティティ追跡を無効にする
データベースからデータをクエリすると、コンテキストはエンティティのスナップショットを作成してエンティティを追跡します。SaveChangesを呼び出すと、エンティティの変更はデータベースに保存されます。
しかし、エンティティをクエリするだけで変更する必要がない場合(読み取り専用)、エンティティ追跡は役に立ちません。AsNoTrackingを呼び出して非追跡データを取得し、クエリのパフォーマンスを向上させることができます。具体的なコードは:
var users = db.Users.AsNoTracking().ToList();
*** 注意:複数のテーブルを検索する場合は、検索前にお問い合わせください **
db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
これにより、すべてのテーブルクエリが非追跡状態になります。