2015-03-26 3 views
0

В традиционном sql мы можем связать выражение в соответствии с утверждениями if.chain string expression linq

, например, позволяет сказать, что у меня есть переменная «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 
+1

Это определенно * не * хорошая практика с SQL. На самом деле, конкатенация строк считается очень плохой практикой, поскольку она предоставляет вам атаки SQL Injection, приводит к низкой производительности * и *, сложнее писать и поддерживать, чем параметризованные запросы. LINQ действительно позволяет осуществлять реальную цепочку, например, просто добавляет '.Where()' вызовы запроса один за другим. Результатом будет правильный SQL-оператор без ifs или '1 = 1' трюков –

+0

@Panagiotis Kanavos, конечно, я использую параметризованные запросы, это просто краткий пример, чтобы представить идею – baaroz

ответ

4

Изменение к методу синтаксиса вместо синтаксиса запросов и построения цепочки легко.

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

запросов в синтаксисе запроса преобразуются во время компиляции, так что это не механизм «впрыснуть» SQL во время выполнения с помощью синтаксиса запросов.

+0

Также стоит отметить, что LINQ to SQL или EF будет создавать параметризованные запросы и передавать, например, 'firstname' в качестве параметра. –

+0

Если у меня есть несколько переменных (имя, фамилия, телефон ...), этот метод запускает несколько запросов sql снова db или только один? – baaroz

+0

Что вы подразумеваете под «выбором не нужно здесь» – baaroz