【问题标题】:Best method for turning a bool list to a linq query against string values将布尔列表转换为针对字​​符串值的 linq 查询的最佳方法
【发布时间】: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


【解决方案1】:

请尝试这样 先比较status再比较参数status...(&&替换为==)


  _dbContext.SalesOrderLookup()
            .Where(x => (x.Status.EqualsTrim("Open") == parameters.Open)
                        || (x.Status.EqualsTrim("Closed") == parameters.Closed)
                        || (x.Status.EqualsTrim("Cancel") == parameters.Canceled)).ToList();

【讨论】:

  • OP 正在与enum 进行比较,而不是字符串!
  • **请尝试... ** x.Status.ToLower().Trim().Equals(parameters.ToString().ToLower().Trim())
【解决方案2】:

为什么不使用bool 类型?即使您使用enums并将其定义为字节类型,每条记录的长度为1字节,而使用3bool类型,则为3位长度。此外,检查一位的性能高于比较字符串。所以我认为更好的选择是在定义复选框时为状态变量定义三个bool 类型。同样通过这种方式,您将能够直接读取和写入 db 而无需任何数据转换。

【讨论】:

    猜你喜欢
    • 2013-09-20
    • 2020-06-02
    • 2010-10-21
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2018-09-07
    相关资源
    最近更新 更多