【问题标题】:Use dynamic linq or sql query in report generator在报告生成器中使用动态 linq 或 sql 查询
【发布时间】:2017-08-30 09:08:33
【问题描述】:

我想在我的项目(ASP.Net、C#)中创建一个简单的报告生成器。我需要通过 linq 查询Sql 查询 来实现这些期货:

最终用户(没有编程信息的用户)选择 来自Dropdown 的实体名称。

linq 查询

dbContext.dbSet

Sql 查询

SELECT * FROM selectedTable

最终用户从checklistbox 中选择实体字段(这些字段 用于绑定到GridView)。为每个人创建TextBoxes。 最终用户稍后输入过滤器网格的值。

linq 查询

使用选定的字段创建自定义 where clauseas customExpression 并在下面的查询中使用它。

dbContext.dbSet.Where(customExpression).ToList()

Sql 查询

SELECT * FROM selectedTable
WHERE CustomWhereCondition

我在以前的项目中使用 Sql 查询,但我倾向于在新项目中使用 linq 查询dynamic Where conditions 将来可能会开发,可能我在linq query 中做不到,或者比Sql query 更难。 我怀疑使用什么方法。

如果有人能解释在我的项目中使用哪种方法更好,那将非常有帮助。

【问题讨论】:

    标签: c# sql asp.net linq report


    【解决方案1】:

    你可以通过使用谓词来解决它。

    public static Func<T, bool> GetWhereLambda<T>(string paramName, dynamic paramValue)
        {            
            var param = Expression.Parameter(typeof(T), "s");
            var classExpr = GetEqualsExpr(param, paramName, paramValue);
            return Expression.Lambda<Func<T, bool>>(classExpr, param).Compile();
        }
    
        private static Expression GetEqualsExpr(ParameterExpression param,
                                 string property,
                                 dynamic value)
        {
            Expression prop = Expression.Property(param, property);
            Expression val = Expression.Constant(value, prop.Type);
            return Expression.Equal(prop, val);
        }
    

    用法:

       Func<T, bool> myLambda = GetWhereLambda<T>(paramName, paramValue);
       var resultset = dbContext.dbSet.Where(myLambda).ToList();
    

    此代码示例仅帮助您使用动态的“参数等于值”表达式。您可以按照相同的过程处理大于、小于并创建自己的表达式树助手。

    【讨论】:

    • 谢谢回答。我知道linq 可以做到的方法。我的问题是哪个更好?为什么?
    • 您可以使用上述方法为简单查询生成自定义表达式。这将有助于提高性能,并且您不会获取所有记录然后对其应用 where 条件。表达式树在内部生成 sql 查询。它最终归结为代码的可维护性。如果您可以在代码中硬编码 sql 语句,您可以通过编写自己的 sql 语句来解决。
    【解决方案2】:

    出于某些重要原因,我强烈建议您使用 ‍LINQ Query

    • 可扩展性和灵活性。
    • 安全性:避免 SQL 注入。
    • 如果表或其列的名称发生变化,它将反映在视图中,您无需在 LINQ Query 中更改它,这与字符串 SQL Query 不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多