【问题标题】:C# Linq where clause as a variableC# Linq where 子句作为变量
【发布时间】:2012-01-03 20:55:40
【问题描述】:

我正在尝试创建一个 LINQ 语句,其中 where 子句来自一个变量。例如:

string whereClause = address.zip == 23456;
var x = from something in someList where whereClause;

这可能吗?我似乎无法让它工作。

谢谢,

更新 - 我的 where 子句是预定义的,将基于用户输入,所以我认为这对我不起作用。基本上 whereClause 不是在方法中构造的,它是执行 LINQ 的方法的参数。我没有解释清楚,这里有一个更好的例子:

public void doLnq(string whereClause)
{
   var x = from something in someList where whereClause;
   dowork(x);
}

更新 - 只是总结一些建议并集中所有内容。

我不能使用开关来生成 where 子句,因为有很多可能性。

你们中的一些人发布的动态 linq 帖子看起来很有希望,但我在将 linq to sql 示例与我的 linq to objects 问题相关联时遇到了麻烦。

和@sLaks 在查看了 msdn http://msdn.microsoft.com/en-us/library/bb353734.aspx 之后,我无法弄清楚您打算在哪里使用 AsQueryable

谢谢,

【问题讨论】:

  • 呃,没有。 where 子句只是 not 字符串,它是一个返回布尔值的表达式。除了...见 SLaks 的链接!
  • @sq33G 这种情况下的字符串是“address.zip == 23456”,我想用 at 作为表达式。该字符串来自用户输入,因此他们可以进行自定义搜索。这有意义吗?
  • 我猜用户正在从下拉列表中选择字段(字段 == 值)。因此,您可能可以使用 switch 语句来构建 Func 以作为 Where 委托发送。
  • 是和否。是的,这就是字符串的定义方式,但值部分是自定义文本,因此只有语句的一侧是可控的。
  • 没关系,你可以用它来创建你的 Where:something => something./*field*/ == inputString

标签: c# linq linq-to-objects


【解决方案1】:

您需要组装一个Expression<Func<T, bool>> 并将其传递给Where() 扩展方法:

Expression<Func<T, bool>> whereClause = a => a.zip == 23456;
var x = frSomeList.Where(whereClause);

编辑:如果您使用的是 LINQ to Objects,请删除单词 Expression 以创建普通委托。

【讨论】:

  • 带有linq-to-objects 标签,Expression 是否合适?
  • @kds6253:那么你可以将委托作为参数。如果需要使用字符串,可以使用动态LINQ(但会慢一些)
  • 速度应该不是问题,它们将是相对简单的查询。您是否碰巧有一个动态linq的简短示例
  • 请参考我对下面类似答案的评论。谢谢。
【解决方案2】:

这个:

var query = from something in someList where whereClause;

是以下的简写:

var query = someList.Where(something => whereClause);

假设someListIEnumerable&lt;Address&gt;Where 指的是Enumerable.Where Extension Method。此方法需要一个Func&lt;Address, bool&gt;,您可以定义如下:

Func<Address, bool> whereClause = address => address.Zip == 23456;
var query = someList.Where(whereClause);

【讨论】:

  • 如何以非 lambda 形式使用?当我使用这种形式时: var query = from something in someList whereClause;它说它需要一个布尔值。谢谢
【解决方案3】:

正如 Richard 所指出的,动态查询库可用于构建动态过滤器表达式。使用 Linq-To-Objects 时,请确保首先将您的 IEnumerable&lt;T&gt; 转换为 IQueryable&lt;T&gt;。这是一个(不完整的)示例:

using System.Linq.Dynamic;

namespace System.Linq.Dynamic
{
  public class Example
  {
   // Assuming some value is assigned to below field somewhere... 
   private IEnumerable<Address> m_Addresses;

   public void FilterByZipCode(string zipCode)
   {
      var x = m_Addresses.AsQueryable().Where("Zip == @0", zipCode);
      dowork(x);
   }
  }

  public class Address
  {  
     public String Zip { get; set; }

     // More Properties...  
  }
}

【讨论】:

    【解决方案4】:

    这是 LINQ 的内置功能。只需使用 Where 扩展方法即可。

    更多信息请参见LINQ Query Syntax versus Method Syntax (C#)

    【讨论】:

      【解决方案5】:

      可以试试:

      var lstQ_Buffer = new List<Q_Buffer>();
      

      获取

      lstQ_Buffer = unitOfWork.Q_BufferRepository.Get().ToList();
      

      然后应用到哪里

      if (lstQ_Buffer.Count > 0)
      {
          lstQ_Buffer = lstQ_Buffer.Where(q => q.fkProgramId == programId && q.fkYearId == yearId && q.fkSemesterId == semesterId && q.fkCourse_ModuleId == courseModuleId && q.fkSubject_SpecialtyId == subjectSpecialtyId && q.fkSubSpecialtyId == subSpecialtyId && q.fkTopicId == topicId && q.fkSubTopicId == subTopicId && q.fkDifficultyLevelId == diffucultyLevelId).ToList();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-12
        • 2015-01-30
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多