c# - 根据用户选择生成 LinqToEntities Where 语句

标签 c# entity-framework optimization

我有用户界面,用户可以在其中选择网格列(如年龄)和该列的运算符(小于、等于或大于)。

然后根据选择过滤网格数据。

我有以下从来自客户端的 JSON 反序列化的类。

/// <summary>
/// Filter for reducing grid results
/// </summary>
public class Filter
{
    /// <summary>
    /// Name of the column
    /// </summary>
    public string name;

    public string value;

    public int @operator { private get; set; }

    public Operator Operator()
    {
        return (Operator) @operator;
    }
}

public enum Operator
{
    None = -1,
    LesserThan = 0,
    Equals = 1,
    GreaterThan = 2
}

由于动态添加新列进行过滤的性质,我想创建访问数据的通用解决方案。

我想避免像这样的大量 if/switch 语句

switch(columnName)
{
    case "age":
    {
        if(operator == Operator.LesserThan)
        {
             query = entities.Where(o => o.Age < age);
        }
        else if (operator == Operator.GreaterThan)
        {
             query = entities.Where(o => o.Age > age);
        }
        etc.

        break;
    }
    etc.
}

关于如何为问题创建更通用的解决方案有什么想法吗?

更新 似乎有很多方法可以实现比十亿个 if 语句更干净的解决方案。现在我只需要比较不同的解决方案。

最佳答案

你可以使用 Dynamic LINQ动态创建查询

编辑:

动态 LINQ 查询的示例如下所示,假设网格中的列名与实体中的字段名相同:

string queryString;
queryString = columnName;
if(operator == Operator.LesserThan)
{
  queryString += " < ";
}
else if (operator == Operator.GreaterThan)
{
  queryString += " > ";
}
etc.
queryString += age.ToString();  // Or use bind variables, haven't tried that myself in dynamic LINQ

query = entites.Where(queryString);

关于c# - 根据用户选择生成 LinqToEntities Where 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9189986/

相关文章:

c# - 如何在代码中设置绑定(bind)?

c# - Json.NET,无法反序列化可为空的类型

c# - 使 Windows 服务像从特定用户运行一样运行

c# - 程序集中写的程序集的入口点信息在哪里?

python - 缓慢的 Julia 启动时间

java - 如何配置Stanford QNMinimizer以获得与scipy.optimize.minimize L-BFGS-B类似的结果

java - 如果没有更改则跳过 DLL 编译

c# - 在数据库未定义的外键关系上配置 Entity Framework

entity-framework - 如何使用流畅的配置在 Entity Framework 6.2 中创建索引

entity-framework - 我如何在没有 App.config 的情况下使用 Entity Framework