【问题标题】:I want to make where clause of LINQ query dynamic我想让 LINQ 查询的 where 子句动态化
【发布时间】:2015-11-21 20:44:54
【问题描述】:

我想让 where 类动态化。当有人调用这个函数时,我不知道参数和比较运算符(例如等于、大于等)和字段名称的总数。我该如何实现呢?

在这个例子中,我使用了三个参数。 “PartitionKey”、“RowKey”和tableName。可以是0或任何数字,也可以是“FirtName”、“Age”等

public void Persons(string whereClauseParameters)
{            
    var query = (from p in cloudTable.CreateQuery<CustomTableEntity>()
                  where p.PartitionKey == "" && p.RowKey != "" && p.TableName == ""
                  select p);
}

【问题讨论】:

标签: c# linq c#-4.0 azure-storage


【解决方案1】:

听起来您正在寻找类似Dynamic Linq 的东西。这允许您执行以下查询:

var query = northwind.Products
                         .Where("CategoryID = 3 AND UnitPrice > 3")
                         .OrderBy("SupplierID");

可以将字段指定为动态字符串,而不是“硬编码”。

【讨论】:

    【解决方案2】:

    这样的?

    public void Persons(Predicate<Person> pred)
    {
        var query = from p in cloudTable.CreateQuery<CustomTableEntity>()
                    where pred(p)
                    select p;
    }   
    

    【讨论】:

    • 仍然需要硬核pred
    【解决方案3】:

    您可以动态地向查询添加条件。示例:

    public void Persons(string firstName, string lastName, int? age) {            
    
      var query = loudTable.CreateQuery<CustomTableEntity>();
    
      if (firstName != null) {
        query = query.Where(p => p.FirstName == firstName);
      }
    
      if (lastName != null) {
        query = query.Where(p => p.LastName == lastName);
      }
    
      if (age.HasValue) {
        query = query.Where(p => p.Age == age.Value);
      }
    
      // then use the query
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 2020-12-31
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      相关资源
      最近更新 更多