2013-09-11 9 views
0

Я знаю о динамическом LINQ, но мне интересно, есть ли способ сделать это, не создавая строку запроса. Я хотел бы иметь возможность использовать все эти красивые встроенные вызовы LINQ, такие как Contains, Count, Distinct и т. Д., Не беспокоясь о SQL, необходимых для их создания. Что я хочу сделать, это:Есть ли способ указать имя поля программно в linq?

AdventureWorks2008R2Entities AWE = new AdventureWorks2008R2Entities(); 
var query = AWE.Employees.AsQueryable(); 
object FieldToQuery = ?; 
if (textBox1.Text != "") query = query.Where(x => x.FieldToQuery.Contains(textBox1.Text)); 

Возможно ли это как-то как-то как, или это противоречит основам LINQ?

+3

Вам нужно построить дерево выражений вручную. – SLaks

+1

То, что вы хотите сделать, как правило, не вариант без отражения. Нет простого способа ссылаться на поле/свойство, кроме статической ссылки на него во время компиляции с оператором доступа. – evanmcdonnal

+1

'AdventureWorks2008R2Entities AWE = new AdventureWorks2008R2Entities();' - поэтому ключевое слово 'var' было введено на C#. –

ответ

0

Рассмотрите возможность использования PredicateBuilder из LINQKit как простая альтернатива для построения дерева выражения вручную:

var predicate = PredicateBuilder.True<Employee>(); 
if (textBox1.Text != "") { 
    var txt = textBox1.Text; 
    predicate = predicate.And(e => e.Field1ToQuery.Contains(txt)); 
} 
if (textBox2.Text != "") { 
    var txt = textBox2.Text; 
    predicate = predicate.And(e => e.Field2ToQuery.Contains(txt)); 
} 

var AWE = new AdventureWorks2008R2Entities(); 
var query = AWE.Employees.AsExpandable().Where(predicate); 

(var txt необходима потому, что под крышкой эти выражения переводятся в соответствующий SQL (упрощенный):

.
SELECT * 
FROM Employees 
WHERE Field1ToQuery LIKE '%' + @p_1 + '%' 

где параметры заполняются значением переменной SQL Server не имеет знания текстового поля на стороне клиента - следующий SQL не удастся:

SELECT * 
FROM Employees 
WHERE Field1ToQuery LIKE '%' + textBox1.Text + '%' 

и (я полагаю) проходит весь текстовое поле в качестве параметра будет слишком сложным.)

+0

проблема заключается не в том, чтобы конкатенировать предложения AND, а в том, чтобы динамически получать поле, в котором будут применяться Содержания ... –

Смежные вопросы