2015-03-03 4 views
0

У меня есть запрос на LINQ к SQL, как этогоLINQ и оператор вопрос

forms = attributesData.Where(x => x.strValue.ToLower().Contains(ddlProvince.SelectedItem.Text.ToLower()) 
      && x.attributeName == "Province" 
      && (x.attributeName=="District" && x.strValue==ddlDistrict.SelectedItem.Text) 
      && (x.attributeName == "TrainingProgram Code" && x.strValue==ddlSearch.Text) 
      && (x.attributeName == "Father Name" && x.strValue==txtform.Text) 

      ).Select(t => t.strFormId).Distinct().ToList(); 

проблема у меня есть только strvalue столбец в моей БД, которая хранит каждую информация теперь я должен применять кратные операции поиска, если я применять и оператор-запрос возвращает null. Но если я применяю или возвращаю значения запроса оператора, но мне нужен результат, а оператор не работает или оператор, пожалуйста, помогите.

+0

Вы используете EAV. Вы используете какой-то ItemId, который является общим для всех атрибутов? – Sarathy

+0

Можете ли вы показать мне, как вы применяете оператор OR? – alsafoo

+0

Другими словами: обновите свой вопрос, чтобы включить запрос с оператором или. – alsafoo

ответ

3

С вашего вопроса, похоже, вы используете шаблон значения атрибута Entity. Чтобы отфильтровать результаты с помощью AND, вам нужно много раз присоединяться к таблице в зависимости от критериев поиска. Это накладные расходы, связанные с этим шаблоном. Ниже приведен пример кода, в котором рассматривается вопрос о том, как объединения могут обрабатываться в вашем сценарии. В этом примере я предполагаю, что идентификатор объекта, который объединяет все атрибуты вместе как «strFormId».

Dictionary<string, string> equalitySearchCriteria = new Dictionary<string, string>(); 
equalitySearchCriteria.Add("TrainingProgram Code", ddlSearch.Text); 
equalitySearchCriteria.Add("District",ddlDistrict.SelectedItem.Text); 
// Add other items 

Dictionary<string, string> likeSearchCriteria = new Dictionary<string, string>(); 
likeSearchCriteria.Add("Province", ddlProvince.SelectedItem.Text.ToLower()); 
// Add other items 

var query = attributesData.Where(x => true); 

foreach(var criterion in equalitySearchCriteria) 
{ 
    var equalityJoinQuery = attributesData.Where(x => x.attributeName == criterion.Key && x.strValue == criterion.Key); 
    query = query.Join(equalityJoinQuery, x => x.strFormId, y => y.strFormId, (x, y) => x); 
} 

foreach(var criterion in likeSearchCriteria) 
{ 
    var likeJoinQuery = attributesData.Where(x => x.attributeName == criterion.Key && x.strValue.Contains(criterion.Key)); 
    query = query.Join(likeJoinQuery, x => x.strFormId, y => y.strFormId, (x, y) => x); 
} 

var result = query.Select(t => t.strFormId).Distinct().ToList(); 
+0

привет спасибо за ваш ответ, но у меня есть ошибка на var query = attributesData.Where (x => x); –

+0

Я предполагаю, что вы получали ошибку при объявлении переменной. nswer. Я набираю код, используя блокнот. Поэтому не удалось проверить ошибки времени компиляции. – Sarathy

+0

Yup Where() ожидает логический результат. Я обновил ответ. Попробуйте сейчас, пожалуйста. Это всего лишь пример запроса инициализации. У вас может быть общий фильтр в этой строке. – Sarathy