0

我知道动态 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 的基本原理?

4

2 回答 2

0

考虑使用PredicateBuilderLINQKit 作为手动构建表达式树的更简单替代方法:

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

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

于 2013-09-12T05:25:16.020 回答
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"));
于 2018-03-05T16:33:06.160 回答