2017-08-30 73 views
0

我想在我的项目(ASP.Net,C#)中创建一个简单的报表生成器。我要低于我可以LINQ查询SQL查询实现这些期货:在报表生成器中使用动态linq或sql查询

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

LINQ查询

dbContext.dbSet 

SQL查询从checklistbox实体的

SELECT * FROM selectedTable 

最终用户选择字段(这些用于结合GridView字段 )。为其中的每一个创建TextBoxes。 最终用户稍后输入过滤网格的值。

LINQ查询

创建所选字段的自定义where clause作为customExpression,并使用它下面的查询。

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

SQL查询

SELECT * FROM selectedTable 
WHERE CustomWhereCondition 

我曾经在我以前的项目SQL查询但我倾向于在新项目中使用LINQ查询dynamic Where conditions可能在未来开发,可能我不能在linq query或更难Sql query。 我怀疑使用什么方法。

如果有人能解释哪种方法更适合我的项目,那将会非常有帮助。

回答

0

我建议你强烈使用LINQ Query的一些重要原因。

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

您可以使用谓词来解决它。

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(); 

此代码示例不仅可以帮助你动态 '其中,param等于值' 表达。您可以按照相同的过程来获得大于,小于,并创建您自己的表达式树帮助程序。

+0

Thx for answer。我知道我可以通过'linq'完成的方法。我的问题是哪一个更好?为什么? –

+0

您可以使用上述方法为简单查询生成自定义表达式。这将有助于您的表现,以及您不会获取所有记录,然后应用条件。表达式树在内部生成sql查询。它最终归结为代码可维护性。如果你可以在你的代码中对sql语句进行硬编码,你可以通过编写你自己的sql语句来解决它。 –