【问题标题】:How could I modify a LinQ query on the fly?如何即时修改 LinQ 查询?
【发布时间】:2018-10-11 06:40:44
【问题描述】:

我基本上有一个向客户端返回值的 WebAPI 服务。

我有一个控制器来处理documents 请求,可以通过简单的enum 提供参数化

这个简单的枚举给出了这样的选择:

public enum DataRange
{
    Last7Days,
    Last30Days,
    Last90Days,
    ThisYear,
    Last10,
    Last50,
    Last100,
    Last500,
    All
}

我想在 DBContext 实际处理查询之前“即时”修改 LinQ 查询,避免我创建一个痛苦的 switch 重复代码并且它不是那么容易阅读,甚至不优雅.

我实际上已经“处理”了这个问题,创建了两种不同的方法,具体取决于它是涉及 Take(x) 还是 DateTime .Where() 过滤器,这让我感到有点紧张。

在这种方法中,我返回 lambda,因为它是一个 .Take(x) 类似的查询:

private IQueryable<Documents> GetQueryByRegistries(DataRange dataRange)
{    
    switch (dataRange)
    {
        case DataRange.Last10:
            return Context.Documents
                              .Where(x => x.Auditoria)
                              .Include(x => x.Variables)
                              .Include(x => x.Events)
                              .OrderBy(x => x.Creation)
                              .Take(10);

        case DataRange.Last50:
            return Context.Documents
                              .Where(x => x.Auditoria)
                              .Include(x => x.Variables)
                              .Include(x => x.Events)
                              .OrderBy(x => x.Creation)
                              .Take(50);
                ...
        case DataRange.All:
            return Context.Documents
                              .Where(x.Auditoria)
                              .Include(x => x.Variables)
                              .Include(x => x.Events)
                              .OrderBy(x => x.Creation);

        default:
            return Context.Documents
                              .Where(x => x.Auditoria)
                            .Include(x => x.Variables)
                            .Include(x => x.Events)
                            .OrderBy(x => x.Creation);
    }
}


private IOrderedQueryable<Documents> GetQueryByDays(DataRange dataRange)
{
    var limitDateTime = DataRange.GetClause(dataRange);
    var documents = Context.Documents
                              .Where(x => x.Auditoria
                                  && x.Creation >= limitDateTime)
                                     .Include(x => x.Variables)
                                     .Include(x => x.Events)
                                     .OrderBy(x => x.Creation);
    return documents;
}

这里我为where 子句创建一个DateTime:

public static DateTime GetClause(DataRange dateTimeRange)
{
    switch (dateTimeRange)
    {
        case DataRange.Last7Days:
            return Last7Days();
        case DataRange.Last30Days:
            return Last30Days();
        case DataRange.Last90Days:
            return Last90Days();
        case DataRange.EsteAno:
            return ThisYear();
        default:
            return BigBang();
    }
}

由于我一直在尝试avoid using switch 场景,我想即时修改query,避免创建这两个又大又丑的switches 并阻止我对查询本身进行参数化,强制复制代码。

我已经尝试过LinqKit,但老实说,我真的不知道如何将我的需求应用到其中。

提前致谢,希望示例有所帮助。

【问题讨论】:

  • 我看不出这两种方法有什么共同之处。特别是我在后者中看不到任何where,也看不到你在哪里进行任何切换,如果它是采取方法还是在哪里方法。
  • @HimBromBeere 嗨!事情是方法应该添加Take 子句,另一个只是修改Where 子句
  • 我喜欢return BigBang(); 部分:)

标签: c# entity-framework linq lambda asp.net-web-api2


【解决方案1】:

我的理解是您想根据您的枚举更改查询。我想这就是你想要的。

private IQueryable<Documents> GetQueryByRegistries(DataRange dataRange)
{    
  // this is your base query. which will be common for all conditions.
  var query = Context.Documents
                          .Where(x => x.Auditoria)
                          .Include(x => x.Variables)
                          .Include(x => x.Events);

 switch (dataRange)
 {
    case DataRange.Last10:
        return query.Where(x => x.SomeId == 10).OrderBy(x => x.Creation)
                          .Take(10); // if you want to add Where again you can do that

    case DataRange.Last50:
        return query.OrderBy(x => x.Creation)
                          .Take(50);
            ...
    case DataRange.All:
        return query.OrderBy(x => x.Creation);

    default:
        return query.OrderBy(x => x.Creation);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 2013-06-03
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多