首页 > 解决方案 > 表选择

问题描述

用户可以从表格中选择任何单元格组合。如果我事先不知道用户将选择多少个单元格,如何生成 LINQ 请求?

db.P.Where(p => p.Date == "01.01.2000");
db.P.Where(p => p.FirstName == "Vitaly");

例如,他将选择一个日期名字,它将如下所示: 在此处输入图像描述

但是,如果您选择不同的组合或更多单元格呢?

标签: c#linq

解决方案


有很多方法可以解决这个问题,但我认为一个简单的方法是过滤器类型。由于您允许每个属性有多个可能的值,因此过滤器应包含可以过滤的每个行属性的集合,并提供匹配函数来测试行。

例如:

class Row
{
    public string Date { get; set; }
    public string FirstName { get; set; }
}

class Filter
{
    public ICollection<string> Dates { get; } = new HashSet<string>();
    public ICollection<string> FirstNames { get; } = new HashSet<string>();

    public bool Matches(Row row) =>
        row != null
        && EmptyOrContains(Dates, row.Date)
        && EmptyOrContains(FirstNames, row.FirstName);

    private static bool EmptyOrContains<T>(ICollection<T> filter, T value) =>
        !filter.Any() || filter.Contains(value);
}

从这里您将能够用于rows.Where(i => filter.Matches(i))选择与过滤器集匹配的所有行。


推荐阅读