2014-01-14 5 views
0

Я могу отфильтровать данные со следующими двумя параметрами id1 и id2 и получить точный результат из 10 записей, из которых 9 с ценой_type = cs и другими с price-type = ms.Как фильтровать запрос linq

Однако, если добавить price_type в параметры id1 и id2 (ID1 = 23456,567890 & id2 = 6782345 & price_type = мс), я получаю 3000 записей вместо получения одной записи.

Я что-то пропустил в коде. Любая помощь будет очень высоко ценится.

 var data = db.database_BWICs.AsQueryable(); 
     var filteredData = new List<IQueryable<database_Data>>(); 


     if (!string.IsNullOrEmpty(query.name)) 
     { 
      var ids = query.name.Split(','); 
      foreach (string i in ids) 
      { 
       filteredData.Add(data.Where(c => c.Name != null && c.Name.Contains(i))); 
      } 
     } 

     if (!string.IsNullOrEmpty(query.id2)) 
     { 
      var ids = query.id2.Split(','); 
      foreach (string i in ids) 
      { 
       filteredData.Add(data.Where(c => c.ID2!= null && c.ID2.Contains(i))); 
      } 
     } 

     if (!string.IsNullOrEmpty(query.id1)) 
     { 
      var ids = query.id1.Split(','); 
      foreach (string i in ids) 
      { 
       filteredData.Add(data.Where(c => c.ID1!= null && c.ID1.Contains(i))); 
      } 
     } 

     if (query.price_type != null) 
     { 
      var ids = query.price_type.Split(','); 
      foreach (string i in ids) 
      { 
       filteredData.Add(data.Where(c => c.Type.Contains(i))); 
      } 
     } 

     if (filteredData.Count != 0) 
     { 
      data = filteredData.Aggregate(Queryable.Union); 
     } 

Обновленный код:

var data = db.database_BWICs.AsQueryable(); 

     if (!string.IsNullOrEmpty(query.name)) 
     { 
      var ids = query.name.Split(','); 
      data = data.Where(c => c.Name != null && ids.Contains(c.Name)); 
     } 

     if (query.price_type != null) 
     { 
      var ids = query.price_type.Split(','); 
      data = data.Where(c => ids.Contains(c.Cover)); 
     } 

     if (!String.IsNullOrEmpty(query.id1)) 
     { 
      var ids = query.id1.Split(','); 
      data = data.Where(c => c.ID1!= null && ids.Contains(c.ID1)); 
     } 
+0

Какие результаты вы получите, если вы самостоятельно запускаете отдельные запросы для параметров 'id1' и' id2'? –

+0

Привет, Спасибо за ваш ответ. Я получаю правильные записи данных, когда я запускаю запросы id1 и id2 отдельно. Например (api/test? Id1 = 5683028) (api/test? Id2 = 7982377). – user3070072

ответ

0

Поскольку вы не добавите фильтр, чтобы ограничить, каждый фильтр добавляет к результату ДАННЫЕ.

Это означает, что вы делаете ИЛИ между вашими фильтрами, а не И.

И ваше использование содержит выглядит довольно странно, тоже: вы используете String.Contains, в то время как я думаю (возможно неправильно), что вы хотите увидеть, если значение в списке =>Enumerable.Contains

Вы должны скорее пойти на что-то вроде этого (withoud filteredData)

var data = db.database_BWICs.AsQueryable(); 
if (!string.IsNullOrEmpty(query.name)) 
{ 
    var ids = query.name.Split(','); 
    data = data.Where(c => c.Name != null && ids.Contains(c.Name))); 
} 
//etc. 

if (query.price_type != null) 
{ 
    var ids = query.price_type.Split(','); 
    data = data.Where(c => ids.Contains(c.Type)); 
} 

EDIT

Ну, если вы хотите смешать и или условия, вы могли бы пойти на PredicateBuilder

Тогда ваш код должен выглядеть так (для проверки).

//manage the queries with OR clause first 
var innerOr = Predicate.True<database_BWICs>();//or the real type of your entity 

if (!String.IsNullOrEmpty(query.id1)) 
{ 
    var ids = query.id1.Split(','); 
    innerOr = innerOr.Or(c => c.ID1!= null && ids.Contains(c.ID1)); 
} 
if (!String.IsNullOrEmpty(query.id2)) 
{ 
    var ids = query.id2.Split(','); 
    innerOr = innerOr.Or(c => c.ID2!= null && ids.Contains(c.ID2)); 
} 
//now manage the queries with AND clauses 
var innerAnd = Predicate.True<database_BWICs>();//or the real type of your entity 

if (query.price_type != null) 
{ 
    var ids = query.price_type.Split(','); 
    innerAnd = innerAnd.And(c => ids.Contains(c.Type)); 
} 
//etc. 

innerAnd = innerAnd.And(innerOr); 

var data = db.database_BWICs.AsQueryable().Where(innerAnd); 
+0

Большое вам спасибо за ваш ответ. Я устал, используя тот же метод, что и раньше, и использование содержит несколько раз в пределах параметров, дает мне «отсутствие ошибки данных» – user3070072

+0

Уважаемый @ Raphael, Если у вас есть время, не могли бы вы взглянуть на эту проблему, я все еще испытываю проблемы фильтрации данных. Спасибо за ваше время и помощь. – user3070072

+0

@ user3070072 где вы получаете ошибку данных? Не могли бы вы попытаться отлаживать шаг за шагом? –

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