Linq查询参数化运算符和列名

时间:2015-10-19 09:36:50

标签: c# asp.net entity-framework linq

网页用户界面

我有一个ASP.NET GridView,在每个列标题中,我有一个下拉列表和文本框对,允许用户过滤列值。在DDL中有6个运算符,在文本框中,用户输入要比较的值。例如:

  • 栏目:数量
  • DDL选择值:“<”
  • TextBox文字:“100”

通过这些选择,用户会指示只想查看数量小于100的记录。

问题

我使用EF和GridView.DataBind()手动将数据绑定到gridview。

在我的数据绑定方法中,我有以上三个项目符号字符串(DBColumnName,Operator,Operand)可用于每个激活的过滤器。

问题是当我尝试为我的Linq EF查询编写Where子句时,如下所示:

Entities.Where(entity => entity.Quantity < 100);

我需要做上面的事情但是喜欢这样:

Entities.Where(entity => <DBColumnName> <Operator> Operand);

DBColumnName和Operator是问题,因为操作数只是一个字符串。

我意识到替代方案可能会重复检查每个控件,但这是不可接受的,因为我的GridView中有十个可过滤的列,因此会有大量的代码。例如:

if (QtyColumnFilterIsActivated) {
    switch (Operator) {
        case "=":
            Entities.Where(entity => entity.Quantity = Operand);
            break;
        case "!=":
            Entities.Where(entity => entity.Quantity != Operand);
            break;
        case "<":
            Entities.Where(entity => entity.Quantity < Operand);
            break;
        // ... and for >, <=, >= ...
    }
// And now this switch block for the other 9 columns.

解决方案的想法

  • ExpressionBuilder类
  • Type.GetType(string TypeName);
  • 硬编码的SQL语句,因为字符串显然很适合一个。不过,EF会更好。
  • 存储过程采用过滤器参数和返回表数据。

感谢所有提前帮助(或尝试),有这样的资源是很好的。如果有任何需要澄清的话,请告诉我。

0 个答案:

没有答案