2016-10-31 3 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; 
     } 

ВЫВОД: "(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))"

Теперь, когда он проходит от двух CreateQueryStructure у меня есть другой метод:

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

Смежные вопросы