【发布时间】: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