实体框架和扩展方法中的委托

时间:2015-02-06 10:43:14

标签: c# entity-framework delegates

最近我遇到了使用委托作为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扩展中使用它们?

1 个答案:

答案 0 :(得分:1)

代理的格式为Func<Input, Output>,而LINQ查询为Expression<Func<Input, Output>>。 LINQ解析表达式以生成查询,而委托则处理SELECT查询返回的数据。请注意,委托版本根本没有过滤。

我相信您可以将谓词更改为Expression<Func<>>,以获得您正在寻找的行为。