【发布时间】:2018-08-18 05:19:07
【问题描述】:
我的应用程序有一部分查询数据库中的记录。此查询中的字段之一是已知值的字符串类型状态:
打开、关闭、取消
用户有 3 个复选框,可以选择任意组合来确定他们返回的记录类型。所以在我的视图模型中,我有一个带有 3 个布尔值的状态过滤器属性:
public class SalesOrderStatusFilter
{
public bool Open { get; set; }
public bool Closed { get; set; }
public bool Canceled { get; set; }
}
现在,当运行查询时,我想根据所选状态类型过滤结果。现在我有一个这样的 linq 查询:
public IEnumerable<SalesOrders> GetSalesOrders(SalesOrderParams parameters)
{
return _dbContext.SalesOrderLookup()
.Where(x => (x.Status.EqualsTrim("Open") && parameters.SalesOrderStatusFilter.Open)
|| (x.Status.EqualsTrim("Closed") && parameters.SalesOrderStatusFilter.Closed)
|| (x.Status.EqualsTrim("Cancel") && parameters.SalesOrderStatusFilter.Canceled)).ToList();
}
这是我的应用程序中的一种常见模式,我想找到一个更好的解决方案,我可以重复使用,而不必每次都输入查询。我已经测试了使用一些自定义属性、反射等将我的数据库字符串状态转换为枚举,但我担心当我对这些不同的报告进行大部分只查看类型的查询时,这有点矫枉过正,所以我我不确定我会坚持下去。它还增加了一些性能损失来进行枚举转换(枚举值并不总是与数据库值匹配,所以这就是我使用反射和自定义属性的原因)。
谁能推荐一个处理这个问题的好方法?
编辑: 为清楚起见,SalesOrderStatusFilter 是另一个
public class SalesOrderParams
{
public string SalesOrderNumber { get; set; }
public SalesOrderStatusFilter SalesOrderStatusFilter { get; set; }
}
我认为我要解决的主要挑战是将布尔值映射到它们的字符串等价物,这可能并不总是按名称匹配(例如,有时有一个空格),然后进行更简洁和可重用的调用。
【问题讨论】:
-
SalesOrderParams是你的枚举吗? -
位标志和位掩码?
-
那么
EqualsTrim()是什么? -
如果你使用了
[Flags]枚举,那么你可以使用位标志 -
@StephenMuecke 抱歉,我的代码有点乱。见编辑。 EqualsTrim 是一种扩展方法,可以修剪空白并进行 Equals() 字符串比较。
标签: c# asp.net-mvc linq