Sql 链字符串表达式linq

Sql 链字符串表达式linq,sql,linq,Sql,Linq,在传统的sql中,我们可以根据if语句来链接表达式 例如,假设我有一个名为“firstName”的变量,我希望根据该变量中的值从数据库中获取所有用户(如果为空,则获取所有用户) 因此,我将像这样链接sql字符串 string sql=""; if(firstname!="") sql=String.format(" And firstname='{0}',firstName) .ExecuteReader(System.Data.CommandType.Text,"select * from

在传统的sql中,我们可以根据if语句来链接表达式

例如,假设我有一个名为“firstName”的变量,我希望根据该变量中的值从数据库中获取所有用户(如果为空,则获取所有用户)

因此,我将像这样链接sql字符串

string sql="";
if(firstname!="")
sql=String.format(" And firstname='{0}',firstName)

.ExecuteReader(System.Data.CommandType.Text,"select * from users where 1=1" + sql)
有没有办法将此技术复制到linq表达式

差不多

from U in user
where 1=1 & sql
select U

更改为方法语法而不是查询语法,链接很容易

var query = user.Select(u => u);  
if(firstname!="")
    query = query.Where(u => u.firstname = firstname);

查询语法中的查询在编译时转换,因此没有一种机制可以在运行时使用查询语法“注入”sql。

更改为方法语法而不是查询语法,链接也很容易

var query = user.Select(u => u);  
if(firstname!="")
    query = query.Where(u => u.firstname = firstname);

查询语法中的查询是在编译时转换的,因此没有一种机制可以在运行时使用查询语法“注入”sql。

这绝对不是sql的好做法。实际上,字符串连接被认为是一种非常糟糕的做法,因为它使您面临SQL注入攻击,导致性能低下,并且比参数化查询更难编写和维护。LINQ确实允许真正的链接,例如简单地将
.Where()
调用逐个添加到查询中。结果将是一个没有ifs或
1=1
tricks@PanagiotisKanavos,当然我使用的是参数化查询,这只是一个简短的示例,用来展示一个思想,但这绝对不是SQL的好做法。实际上,字符串连接被认为是一种非常糟糕的做法,因为它使您面临SQL注入攻击,导致性能低下,并且比参数化查询更难编写和维护。LINQ确实允许真正的链接,例如简单地将
.Where()
调用逐个添加到查询中。结果将是一个没有ifs或
1=1
tricks@PanagiotisKanavos,当然我使用的是参数化查询这只是一个简短的例子来展示一个想法同样值得注意的是,LINQ to SQL或EF将创建参数化查询并将eg
firstname
作为参数传递。如果我有多个变量(firstname、lastname、phone…)这种技术会对数据库运行多个sql查询还是只运行一个sql查询?您所说的“这里不需要选择”是什么意思@使用
ToList
foreach
loop@baaroz为了扩展@Grundy的响应,在使用
ToList
foreach
将其具体化之前,查询实际上不会执行。因此,在此之前链接到查询的任何内容都将被合并到一个查询中值得注意的是,LINQ to SQL或EF将创建参数化查询,并将eg
firstname
作为参数传递。如果我有多个变量(firstname、lastname、phone…),此技术会对数据库运行多个SQL查询还是只运行一个查询?您所说的“此处无需选择”是什么意思@使用
ToList
foreach
loop@baaroz为了扩展@Grundy的响应,在使用
ToList
foreach
将其具体化之前,查询实际上不会执行。因此,在此之前链接到查询的任何内容都将合并到一个查询中。