簡體   English   中英

Func <t,bool> vs C#lambda中的手動表達性能

[英]Func<t, bool> vs Manually expression performance in C# lambda

請看看這些線:

1.在這種情況下,我直接在方法中鍵入where語句

public List<User> GetUsers()
{
    return _entity.Where(x => x.Id == 1).ToList();
}

執行的sql查詢是:

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Username] AS [Username], 
    [Extent1].[Password] AS [Password], 
    [Extent1].[Email] AS [Email],
    [Extent2].[Id] AS [Id1]
    FROM  [dbo].[Account_Users] AS [Extent1]
    LEFT OUTER JOIN [dbo].[Account_Profiles] AS [Extent2] ON [Extent1].[Id] = [Extent2].[UserId]
    WHERE 1 = [Extent1].[Id]

2.在這種情況下,我使用Func for generic where子句

public List<User> GetUsers(Func<User, bool> where)
{
    return _entity.Where(where).ToList();
}
var users = _acc.GetUsers(x => x.Id == 1);

執行的sql查詢是:

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Username] AS [Username], 
    [Extent1].[Password] AS [Password], 
    [Extent1].[Email] AS [Email], 
    [Extent2].[Id] AS [Id1]
    FROM  [dbo].[Account_Users] AS [Extent1]
    LEFT OUTER JOIN [dbo].[Account_Profiles] AS [Extent2] ON [Extent1].[Id] = [Extent2].[UserId]

正如您所看到的,在情況2中,where子句是WHERE 1 = [Extent1].[Id]丟失,因此整個記錄存儲在內存中。 你知道為什么where子句沒有在sql查詢中翻譯?
我想在.Where()使用Func<t, bool> ,因此它是通用的,不需要為每個查詢創建函數。
有沒有辦法使用.Where(Func<t, bool>)並且還可以在sql查詢中看到翻譯的where子句?

如果希望lambda在SQL中執行,則需要將其作為Expression傳遞,而不是函數:

public List<User> GetUsers(Expression<Func<User, bool>> where)
{
    return _entity.Where(where).ToList();
}
var users = _acc.GetUsers(x => x.Id == 1);

如果你想知道差異是什么(畢竟,lambda本身看起來一樣),看看這個問題

代替

public List<User> GetUsers(Func<User, bool> where)

你應該使用

public List<User> GetUsers(Expression<Func<User, bool>> where)

當您使用Expression Entity Framework時,能夠正確地將其轉換為SQL。 另一方面,當您使用Func Entity框架時,不知道如何將其轉換為SQL,因此它使用內存中處理。

這是因為在這兩種情況下,編譯代碼包含對兩種不同擴展方法的調用: Queryable.WhereEnumerable.Where Queryable類包含用於處理來自不同數據源(包括外部源)的數據的擴展方法,而Enumerable包含用於內存中對象處理的擴展方法。 Queryable版本Where接受Expression ,而不是Func

Lamda表達式可以隱式轉換為ExpressionFunc ,因此其他答案指出您只需要接受一個Expression實例作為函數參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM