最近我遇到了使用委托作为EF的LINQ扩展中的谓词的问题。 这是一个简单的例子。
Func<LmsIdentityUser, bool> predicate = u => u.FullName.Contains(val) || u.EmployeeId.Contains(val);
var result = _ctx.Users.Where(predicate).ToList();
var result2 = _ctx.Users.Where(u => u.FullName.Contains(val) || u.EmployeeId.Contains(val)).ToList();
我希望两个查询都能生成相同的SQL查询,因为Where()
中使用的谓词是相同的。唯一的区别是,在第一种情况下,它是使用委托定义的。
但这里是EF为这些情况生成的实际SQL查询。
案例1(使用委托)
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[EmployeeId] AS [EmployeeId],
[Extent1].[FullName] AS [FullName]
FROM [dbo].[AspNetUsers] AS [Extent1]
案例2(直接使用lambda)
SELECT TOP (15)
[Extent1].[Id] AS [Id],
[Extent1].[EmployeeId] AS [EmployeeId],
[Extent1].[FullName] AS [FullName]
FROM [dbo].[AspNetUsers] AS [Extent1]
WHERE ([Extent1].[FullName] LIKE @p__linq__0 ESCAPE N'~') OR ([Extent1].[EmployeeId] LIKE @p__linq__1 ESCAPE N'~')
所以问题是代表们有什么问题?如何在LINQ扩展中使用它们?
答案 0 :(得分:1)
代理的格式为Func<Input, Output>
,而LINQ查询为Expression<Func<Input, Output>>
。 LINQ解析表达式以生成查询,而委托则处理SELECT查询返回的数据。请注意,委托版本根本没有过滤。
我相信您可以将谓词更改为Expression<Func<>>
,以获得您正在寻找的行为。