EF LINQ 查詢性能優化


1、適時的使用AsNoTracking()進行數據查詢,可提高執行效率,他是無跟蹤查詢,即查詢的實體無法進行更改操作。Update無效

var customer = context.Customer.AsNoTracking().Where(p=>p.Name == 'zhangsan').FirstOrDefault();
customer.Age = 30;
context.SaveChanges();
//以上代碼無法更新數據到數據庫

  

2、EF 中使用AsNonUnicode(),不加AsNonUnicode SQL中會有 N,加了AsNonUnicode后,SQL中沒有N ,使用 N 前綴(查詢過程中需要把數據庫默認格式轉化為Unicode 格式來查詢,因此:性能被拉低),當然如果查詢包含中文字符等建議不要使用該方法

執行如下語句,並用SqlProfiler監控其SQL:

var list = context.Customer.Queryable().Where(w => w.CustomerId == guid && w.Name == "xxx")
.Select(s => new
{
Age = s.Age,
Name = s.Name
})
.ToList();

  

生成SQL如下:

SELECT 1 AS [C1],
[Extent1].[Age] AS [Age],
[Extent1].[Name] AS [Name]
FROM [dbo].[FL_Customer] AS [Extent1]
WHERE ([Extent1].[CustomerId] = 'f97317a1-21e1-4a6e-b1f9-960fc1def7eb' /* @p__linq__0 */)
AND (N'xxx' = [Extent1].[Name])

  

下面使用AsNonUnicode():

var list = context.Customer.Queryable().Where(w => w.CustomerId == guid && w.Name == EntityFunctions.AsNonUnicode("xxx"))
.Select(s => new
{
Age = s.Age,
Name = s.Name
})
.ToList();

  

生成SQL如下:

SELECT 1 AS [C1],
[Extent1].[Age] AS [Age],
[Extent1].[Name] AS [Name]
FROM [dbo].[FL_Customer] AS [Extent1]
WHERE ([Extent1].[CustomerId] = 'f97317a1-21e1-4a6e-b1f9-960fc1def7eb' /* @p__linq__0 */)
AND ('xxx' = [Extent1].[Name])

  

3、判斷數據庫是否存在某條數據時,請使用Any(),不要使用Count()

推薦:
var query = context.Customer.Any(p=>p.Name =='張三');
少用:
var result = context.Customer.Where(p=>p.Name == '張三').Count() > 0;

  

4、Where條件中,判斷數組時,請使用Contains(),不要使用Any(),否則可能在查詢時,出現如下錯誤信息:
  錯誤信息:Too high level of nesting for select

推薦:
var list = new List<int>{1,2,3,4,5,6,6,8,9,10};
var query = context.Customer.Where(p=>list.Contains(p.Id)).ToList();
慎用:
var list = new List<int>{1,2,3,4,5,6,6,8,9,10};
var query = context.Customer.Where(p=>list.Any(c=> c == p.Id)).ToList();

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM