![](/img/trans.png)
[英]Expression<Func<T,bool>> vs Func<T,bool> in method overloading
[英]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.Where
和Enumerable.Where
。 Queryable
類包含用於處理來自不同數據源(包括外部源)的數據的擴展方法,而Enumerable
包含用於內存中對象處理的擴展方法。 Queryable
版本Where
接受Expression
,而不是Func
。
Lamda表達式可以隱式轉換為Expression
和Func
,因此其他答案指出您只需要接受一個Expression
實例作為函數參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.