Предложение IQueryable, сгенерированное из списка, которое необходимо объединить с помощью оператора OR - PullRequest
0 голосов
/ 01 августа 2020

У меня есть список, из которого я хочу сгенерировать запрос. Мне нужно вернуть элементы, соответствующие каждой записи в моем списке, и в списке используются два значения для сопоставления с базой данных. Код, созданный вручную, будет похож на этот шаблон ...

    from x in Context.Items
    where (x.Prop1 == 5 && x.Prop2 == "Foo") ||
          (x.Prop1 == 2 && x.Prop2 == "Bar") ||
          (x.Prop1 == 9 && x.Prop2 == "Etc")
    select x

Если бы я хотел сравнить только одно свойство, я бы просто использовал подход 'list.Contains (x => x.Prop1)', но я нужно сравнивать по двум значениям, а не по одному. Есть идеи?

1 Ответ

0 голосов
/ 01 августа 2020

Есть несколько простых способов сделать это, и есть лучшие ответы, если вы его поищете. Это моя версия, основанная на том, если модель «список» содержит Prop1 и Prop2.

  • Первое решение - это добавляет Prop1 и Prop2 в их собственные списки.

         var getProp1List = list.Select(i => i.Prop1).ToList();
         var getProp2List = list.Select(i => i.Prop2).ToList();
    
         var results = queryList.Where(i => getProp1List.Contains(i.Prop1) && getProp2List.Contains(i.Prop2)).ToList();
    
  • Второе решение - это выбирает несколько объектов в один список.

         var getSearchTerms = list.Select(i => new { i.Prop1, i.Prop2 }).ToList();
    
         var results = queryList.Where(i => getSearchTerms.Select(x=>x.Prop1).Contains(i.Prop1) && getSearchTerms.Select(x => x.Prop2).Contains(i.Prop2)).ToList();
    
  • Третье решение - простейшее - использование получает списки данных с помощью выбора из исходного списка .

       var results = queryList.Where(i => list.Select(x=>x.Prop1).Contains(i.Prop1) && 
       list.Select(x => x.Prop2).Contains(i.Prop2)).ToList();
    

И вот, если у меня есть, правильно понял вопрос !!

...