有没有办法在linq中以编程方式指定字段名称?

时间:2013-09-11 21:50:28

标签: c# linq linq-to-entities

我知道动态LINQ,但我想知道是否有办法在不构建查询字符串的情况下执行此操作。我希望能够使用所有那些内置的LINQ调用,如Contains,Count,Distinct等,而不必担心创建它们所需的SQL。我想做的是:

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

这样的事情可能是某种方式,还是违背了LINQ的基本原理?

2 个答案:

答案 0 :(得分:0)

考虑使用LINQKit中的PredicateBuilder作为手工构建表达式树的更简单的替代方法:

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 + '%'

和(我想)将整个文本框作为参数传递将太复杂。)

答案 1 :(得分:0)

你可以使用 https://github.com/PoweredSoft/DynamicLinq

Nuget包 https://www.nuget.org/packages/PoweredSoft.DynamicLinq/

并且

queryable.Query(t => t.Contains("PropertyOrField", "search value"));

如果您想查询多个字段,可以

queryable.Query(t => t.Contains("FirstName", "Dav").OrContains("FirstName", "Jo"));