2016-10-31 24 views
1

を使用してフィルタを追加します。私はこのような方法とクエリ持つXML

public static string GetChartEnergy(string initDate, string endDate, string type) 
     { 
structure.Add(initDate.CreateQueryStructure(endDate, true, null, "convert(datetime,'15/' + CONVERT(varchar(10), k.Month) + '/' + CONVERT(varchar(10), k.Year), 103)", null, false)); 
structure.Add(type.CreateQueryStructure(string.Empty, false, "CASE WHEN m.Type = 1 THEN 'Agua' ELSE CASE WHEN m.Type = 2 THEN 'Luz' ELSE 'Gas' END END AS Type", " m.type", "m.Type", false)); 
     } 

CreateQueryStructureすることは、このいずれかになります。

public static QueryStructure CreateQueryStructure(this String value, string endDate, bool isDate, 
      string columnName, string whereName, string groupByName, bool isNullField) 
     { 
      QueryStructure structure = new QueryStructure(); 

      if (!string.IsNullOrEmpty(value)) 
      { 
       if (value != ",") 
       { 
        if (isDate) 
        { 
         //obtiene la estructura para un filtro entre fechas 
         structure.ColumnSelect = columnName; 
         structure.ColumnGroupBy = groupByName; 
         structure.ColumnWhere = string.Format("({0} BETWEEN convert(datetime,\'{1}\', 103) and convert(datetime,\'{2}\', 103))", whereName, value.Remove(value.Length - 1), endDate.Remove(value.Length - 1)); 
         structure.Values = null; 
         structure.Operator = Operator.Nothing; 
        } 
        else 
        { 
         if (isNullField) 
         { 
          //obtiene la estructura de un filtro por un campo que es null o no 
          if (value.Remove(value.Length - 1) != "-1") 
          { 
           structure.ColumnWhere = string.Format("{0} IS{1} NULL", whereName, 
            value.Remove(value.Length - 1) == "0" 
                     ? " NOT" : 
                     string.Empty); 

           structure.Values = null; 
           structure.Operator = Operator.And; 
          } 
         } 
         else 
         { 
          //obtiene la estructura de un campo aplicando la regla IN seleccionando 
          //el campo a mostrar y el campo en groupBy 
          structure.ColumnSelect = columnName; 
          structure.ColumnGroupBy = groupByName; 
          structure.ColumnWhere = whereName; 
          structure.Values = value.Remove(value.Length - 1); 
          structure.Operator = Operator.And; 
         } 
        } 
       } 
      } 

      return structure; 
     } 

OUTPUT:それは私が持っている2 CreateQueryStructure渡すから今"(convert(datetime,'15/' + CONVERT(varchar(10), k.Month) + '/' + CONVERT(varchar(10), k.Year), 103) BETWEEN convert(datetime,'01/01/2014', 103) and convert(datetime,'31/10/2016', 103))"

別の方法:

public static string GetChartInfo(List<QueryStructure> queryStructure, string procedureName) 
     { 
       var queryWhere = queryStructure.GetWhere(); 
} 

だから今、それはGetWhereに渡す:

public static string GetWhere(this List<QueryStructure> filters) 
     { 
      string result = string.Empty; 

      if (filters != null && filters.Count > 0) 
      { 
       if (filters.Select(x => x.ColumnWhere).Any()) 
       { 
        result += "WHERE "; 

        foreach (var filter in filters) 
        { 
         if (filter.Operator != Operator.Nothing) 
         { 
          result += " " + filter.Operator.ToString() + " "; 
         } 

         if (!string.IsNullOrEmpty(filter.Values)) 
         { 
          result += filter.ColumnWhere + " IN ("; 

          result += filter.Values; 

          result += ") "; 

         } 
         else 
         { 
          result += filter.ColumnWhere; 
         } 
        } 
       } 
      } 

      return result; 
     } 

そして最後に、それは、where句で出力を返す:

"WHERE (convert(datetime,'15/' + CONVERT(varchar(10), k.Month) + '/' + CONVERT(varchar(10), k.Year), 103) BETWEEN convert(datetime,'01/01/2014', 103) and convert(datetime,'31/10/2016', 103)) And m.type IN (2) " 

そして、私は句があるCurrentUserのアイテムのみを取得する場所を変更したいので、私が得ます以下のように、コントローラからパラメータを送信する方法であるCurrentUser:今すぐ

public static string GetChartEnergy(string initDate, string endDate, string type, int currentUser) //there I have currentUser 

は、どのように私はこのフィルタを追加することができます:

structure.Add(initDate.CreateQueryStructure(endDate, true, null, "convert(datetime,'15/' + CONVERT(varchar(10), k.Month) + '/' + CONVERT(varchar(10), k.Year), 103)", null, false)); 

linq私はちょうどx => x.user == currentUserのようにいくつか行う必要がありますが、xmlで私はどのように助けてくれますか?よろしく

更新:クエリ構造クラス:あなたの方法を見て

public class QueryStructure 
    { 
     public string ColumnGroupBy { get; set; } 

     public string ColumnSelect { get; set; } 

     public string ColumnWhere { get; set; } 
     public Operator Operator { get; set; } 

     public string Values { get; set; } 

    } 
+0

上記の関数の入力と出力の関係を詳しく教えてください。また、QueryStructureクラスを貼り付けるとうまくいくでしょうか。 –

+0

私はより明確になるように私の質問を再構成する@DirtyDeveloper – Dawin

+0

あなたも同様にQueryStructureモデルクラスを貼り付けてください。 –

答えて

1

それは非常に簡単になります。

public static string GetChartEnergy(string initDate, string endDate, string type,string currentUser) 
    { 
structure.Add(initDate.CreateQueryStructure(endDate, true, null, "convert(datetime,'15/' + CONVERT(varchar(10), k.Month) + '/' + CONVERT(varchar(10), k.Year), 103)", null, false)); 
structure.Add(type.CreateQueryStructure(string.Empty, false, "CASE WHEN m.Type = 1 THEN 'Agua' ELSE CASE WHEN m.Type = 2 THEN 'Luz' ELSE 'Gas' END END AS Type", " m.type", "m.Type", false)); 

structure.Add(curentUser.CreateQueryStructure(string.Empty, false, string.Empty, "m.User", string.Empty, false)); 
} 

m.Userが をフィルタリングするユーザー列であると仮定しているだろうこのような出力を与える

WHERE (convert(datetime,'15/' + CONVERT(varchar(10), k.Month) + '/' + CONVERT(varchar(10), k.Year), 103) BETWEEN convert(datetime,'01/01/2014', 103) and convert(datetime,'31/10/2016', 103)) And m.type IN (2) AND m.User IN("yourusername") 
+0

@Dawin、あなたがこのコードに対して実行すると私に知らせてください。変更が必要な場合はお知らせください –

+0

もちろん、私は明日にそれをテストし、大いに感謝する !よろしくご連絡ください – Dawin

+0

汚いですか? – Dawin

関連する問題