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

问题描述 投票:0回答:2

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

c# linq linq-to-entities
2个回答
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 + '%'

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


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"));
© www.soinside.com 2019 - 2024. All rights reserved.