【问题标题】:Build query dynamically based on request object properties根据请求对象属性动态构建查询
【发布时间】:2018-10-31 14:38:54
【问题描述】:

我有一个网络应用程序,用户可以在其中根据某些过滤条件从数据库中获取记录。他们可以获取所有记录,或两个日期之间的所有记录,或特定实体类型的所有记录,或特定用户的所有记录等。我使用 EF6 和标准 DbContext 类来查询数据库

我要做的是根据请求对象动态构建查询,并且哪些属性不为空。因此,如果用户选择从和到日期,但没有其他条件,则查询应该转到数据库并获取所述日期之间的所有记录。如果用户没有选择日期而是选择实体类型,则查询应该只过滤请求对象的该属性。

那么在伪代码中,在构建查询时我将如何做到这一点

  • 检查所有请求对象属性
  • 哪些属性不为空,请将它们作为参数添加到查询表达式中

这是我的请求对象

public class ChangeLogRequestDto
{
    public DateTime? FromDate { get; set; }
    public DateTime? ToDate { get; set; }
    public string UserName { get; set; }
    public string CallCenter { get; set; }
    public string EntityType { get; set; }
    public string PropertyName { get; set; }
    public string CompanyId { get; set; }
}

这是我的 Service 方法,用于接收此请求对象并构建查询以获取记录

 public IEnumerable<ChangeLog> GetChangeLogWithFilter(ChangeLogRequest request)
    {
       // check the request object and build a query based on its values.
       return dbContext.ChangeLogs.Where(query)
    }

我查找了其他示例,但鉴于我不熟悉 Expressions 和 Linq,它们对我来说没有意义。有什么想法吗?

【问题讨论】:

  • 如果您展示一个实际查询数据库的示例,例如您是使用原始 SQL、存储过程还是 Linq(对于 ORM),或者..
  • @stuartd 我正在使用 EF6,并且到目前为止一直在使用像这样的直接 linq 查询。 return dbContext.ChangeLogs.Where(c=> c.ID == request.Id);
  • Linq != Lambda。它们可以产生相同的结果,但它们的写法不同。 .Where() 是一个 Lambda。

标签: c# entity-framework


【解决方案1】:

这是我将如何做的一个例子(基于我认为你正在尝试做的事情)

public IEnumerable<ChangeLog> GetChangeLogWithFilter(ChangeLogRequest request)
{
   var query = dbContext.ChangeLogs;
   if(request.FromDate != null && request.ToDate != null)
   {
      query = query.Where(x => x.DateSubmitted > request.FromDate && x.DateSubmitted <= request.ToDate);
   }

   if(!string.IsNullOrEmpty(request.UserName))
   {
      query = query.Where(x => x.UserName.Equals(request.UserName));
   }
   // then you repeat the above with the rest of the values if they are available
   return query.ToList();
}

希望这会照顾您的用例。有更高级的方法来构建查询,例如表达式树,但我认为对于上述要求,您应该能够做到这一点。

【讨论】:

    【解决方案2】:

    您好 Del,我强烈建议您使用像 OData(开放数据协议)这样的标准模式:

    这将允许您对 OData 端点执行动态查询,例如访问元素详细信息、对列表进行排序以及应用您想要的过滤器,所有这些都直接来自您的 HTTP 请求。

    希望对您有所帮助,如果您需要任何额外的帮助或说明,请告诉我

    【讨论】:

      猜你喜欢
      • 2017-09-30
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多