2017-08-30 43 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語句來解決它。 –