【问题标题】:Is there a way to specify a field name programatically in linq?有没有办法在 linq 中以编程方式指定字段名称?
【发布时间】:2023-04-07 06:38:01
【问题描述】:

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

【问题讨论】:

  • 你需要手动构建一个表达式树。
  • 您想要做的事情通常不是没有反思的选择。除了在编译时使用访问运算符静态引用它之外,没有简单的方法来引用字段/属性。
  • AdventureWorks2008R2Entities AWE = new AdventureWorks2008R2Entities(); - 这就是在 C# 中引入 var 关键字的原因。
  • @evanmcdonnal 完全不真实。
  • @evanmcdonnal Expression<Func<Account, bool>> expr = x => x.Name == "Something";。这不是java,伙计。当所有其他选择都用尽时,反思总是最后的手段。

标签: c# linq linq-to-entities


【解决方案1】:

考虑使用来自 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 + '%'

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

【讨论】:

  • 问题不是连接 AND 子句,而是动态获取将应用 Contains 的字段...
【解决方案2】:

你可以使用 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"));

【讨论】:

    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多