生成的SQL的差异

Jay*_*Jay 2 c# linq linq-to-entities linq-to-sql

以下c#代码:

Func<Customer, bool> predicate1 = s => s.Name == "Roger";
dbContext.Customers.Where(predicate1);
Run Code Online (Sandbox Code Playgroud)

生成这个SQL查询:

select col1,col2 from customers 
Run Code Online (Sandbox Code Playgroud)

注意在上面的sql查询中,没有where子句.

但是,在这个c#代码中:

dbContext.Customers.Where(s => s.Name == "Roger");   
Run Code Online (Sandbox Code Playgroud)

它产生:

select col1,col2 from customers where name = 'Rogers'
Run Code Online (Sandbox Code Playgroud)

为什么有区别?有没有办法传递像上面这样的谓词,仍然生成带有where子句的SQL查询?

Jon*_*eet 5

不同之处在于,在第一种情况下,您使用Enumerable.Where委托(Func<Customer, bool>)进行调用.LINQ提供程序本身根本没有看到 - Enumerable.Where只是迭代整个dbContext.Customers表,并在进程中应用谓词.

在第二种情况下你调用Queryable.Where表达式树.LINQ提供程序可以将此"代码作为数据"进行分析并将其转换为SQL.

这将做你想要的:

Expression<Func<Customer, bool>> predicate1 = s => s.Name == "Roger";
dbContext.Customers.Where(predicate1);
Run Code Online (Sandbox Code Playgroud)