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

mhe*_*abi 5 c# sql-server lambda

请看看这些线:

1.在这种情况下,我直接在方法中键入where语句

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

执行的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]
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

执行的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]
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在案例2中where子句WHERE 1 = [Extent1].[Id]缺失,因此整个记录存储在内存中.你知道为什么where子句没有在sql查询中翻译?
我想用Func<t, bool>.Where()所以这将是通用的,没有必要创建函数为每个查询.
有什么方法可以使用.Where(Func<t, bool>),还可以在sql查询中看到翻译的where子句?

Glo*_*del 10

如果希望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);
Run Code Online (Sandbox Code Playgroud)

如果你想知道差异是什么(毕竟,lambda本身看起来一样),看看这个问题.