将布尔列表转换为针对字​​符串值的linq查询的最佳方法

时间:2018-08-18 05:19:08

标签: c# asp.net-mvc linq

我的应用程序的一部分可以查询数据库中的记录。此查询中的字段之一是已知值的字符串类型状态:

打开,关闭,取消

用户具有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();
    }

这是我的应用程序中的常见模式,我想找到一个更好的解决方案,可以重复使用而不必每次都不断键入查询。我已经测试过使用一些自定义属性,反射等将db字符串状态转换为枚举,但是当我对这些不同的报表执行大多数仅查看类型的查询时,我担心这有点过头了,所以我我不确定我会坚持下去。它还增加了一些性能上的损失来进行枚举转换(枚举值并不总是与数据库值匹配,因此这就是为什么我使用反射和自定义属性)。

有人可以推荐一种解决此问题的好方法吗?

编辑: 为了清楚起见,SalesOrderStatusFilter是另一个

的属性。
public class SalesOrderParams
{
    public string SalesOrderNumber { get; set; }
    public SalesOrderStatusFilter SalesOrderStatusFilter { get; set; }
}

我认为我要解决的主要挑战是将布尔值映射到它们的字符串等效项,而字符串等效项可能并不总是按名称匹配(例如,有时会有一个空格),然后进行更简洁和可重用的调用。

2 个答案:

答案 0 :(得分:0)

请尝试这样 首先与状态进行比较,再与参数状态进行比较...(&&替换==)


let filePath = container.appendingPathComponent("Documents").appendingPathComponent(fileName).path

答案 1 :(得分:0)

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