【问题标题】:Dynamicallly building Linq "where" clause动态构建 Linq “where”子句
【发布时间】:2011-12-18 09:23:33
【问题描述】:

我正在尝试通过编写额外的代码行来做一些传统上可以完成的事情。我在这个网站上看到的几个样本可以解决我的问题,但我仍然无法将所有部分放在一起来解决我想要实现的目标。

这是我正在尝试做的伪代码:

list<t> searchTerms;

class t
{
string columnName;
string columnValue ;
string columnType ;
 string FilterType;
}

我正在使用 Linq to SQL 从我的数据库中检索数据,并希望使用列表构建“where”子句:

类似:

SearchTerm t = terms.Find(term => term.ColumnValue == "PartNo");
if (t != null)
{
  switch (t.FilterType)
  {
    case FilterType.Contains:
      q = q.Where(c => c.PartNo.Contains(t.Value));
      break;

    case FilterType.EqualTo:
      q = q.Where(c => c.PartNo.Equals(t.Value));
      break;

    case FilterType.StartsWith:
      q = q.Where(c => c.PartNo.StartsWith(t.Value));
      break;
  }
}

t = terms.Find(term => term.ColumnValue == "ItemDesc");
if (t != null)
{
  switch (t.FilterType)
  {
    case FilterType.Contains:
      q = q.Where(c => c.ItemDesc.Contains(t.Value));
      break;

    case FilterType.EqualTo:
      q = q.Where(c => c.ItemDesc.Equals(t.Value));
      break;

    case FilterType.StartsWith:
      q = q.Where(c => c.ItemDesc.StartsWith(t.Value));
      break;
  }
}

我想做的是使用 lambda 表达式/反射来实现:

q.whereJoinExpression(searchTerms.ToLamdaExpression());

在哪里 searchTerms.ToLamdaExpression()

应该返回给我 where 子句的输入,即 Expression>。 和 whereJoinExpression 应该得到与

相同的结果
 q = q.Where(searchTerms.ToLamdaExpression());

在发布此问题之前,我进行了几天的研究,希望能在正确的方向上提供帮助。

【问题讨论】:

标签: c# linq linq-to-sql


【解决方案1】:

【讨论】:

  • 但是 Dynamic LINQ 失去了强类型的所有好处,而且似乎总是一个逃避解决方案。像 PredicateBuilder 这样的东西会更好,如果它可以工作的话。
  • 是的,这就是我正在努力解决的问题
  • @sharmasu:在动态查询情况下,通常用户无论如何都会从字符串构建查询(例如,从下拉列表中选择字段),所以我看不出强类型有多大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多