我知道动态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的基本原理?
答案 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"));