我有用户界面,用户可以在其中选择网格列(如年龄)和该列的运算符(小于、等于或大于)。
然后根据选择过滤网格数据。
我有以下从来自客户端的 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/