2015-05-18 4 views
-1

У меня есть веб-страница, на которой пользователь может ограничить результаты на основе трех разных вариантов выбора нескольких вариантов (см. Прилагаемое изображение).Несколько предложение WHERE IN LINQ эквивалент

Немного фона. Документы имеют много секторов, компаний и аналитиков, назначенных им. У моих объектов EF есть свойства навигации, что означает, что мне не нужно писать явные JOINS, чтобы получить нужные мне данные.

Моя проблема: я не могу построить запрос LINQ, который мне нужен, чтобы получить нужные мне результаты. Использование SQL было бы простым, и я мог бы легко использовать комбинацию JOINS и WHERE IN ('Blah', 'Another blah'). В моем контроллере у меня есть следующий код:

public JsonResult FilterResearch(FilterResearchModel filterResearch) 
{ 
     var db = new Context(); 

     // home model 
     var model = new HomeModel(); 

     var selectedSectors = from s in db.Sectors 
           where filterResearch.SelectedSectors.Contains(s.Name) 
           select s; 

     var selectedCompanies = from c in db.Companies 
           where filterResearch.SelectedCompanies.Contains(c.Name) 
           select c; 

     var selectedAnalysts = from a in db.Analysts 
           where filterResearch.SelectedAnalysts.Contains(a.Name) 
           select a; 

     var filteredResults = from d in db.Documents 
         where selectedSectors.Contains(d.Sectors) 
         select d; 

FilterResearch.Selected «Something» строковые массивы. Мой запрос «filterResults» - это то, что должно содержать отфильтрованные документы, которые я планирую вернуть.

EDIT Некоторые люди прокомментировали тот факт, что я не понимаю. Я пытаюсь отфильтровать мои документы на основе 3 строковых массивов. Каждый из этих строковых массивов является свойствами навигации в объекте «document». На клиенте у пользователя есть три элемента управления с несколькими элементами, поэтому каждый массив может иметь более одного элемента. Теперь они могут выбрать любой из трех и выбрать столько вариантов, сколько пожелают.

ЭТО ПРОБЛЕМА Когда я скомпилировать я получаю следующее сообщение об ошибке: «не удается преобразовать из„System.Linq.IQueryable“до«System.Linq.ParallelQuery>»

EDIT СНОВА Изображение ошибка включена. Это происходит на "где selectedSectors.Contains (d.Sectors)" enter image description here

Я проверил:

с немного удачи. Есть ли способ, по которому я могу просто сказать «отфильтровать документы на основе компаний И-секторов и аналитиков?

+3

Вы не показали нам, что вы на самом деле делаете с этими запросами, где ваша проблема явно лежит. – Servy

+0

Вы ищете '.Where (o => o.Companies.Contains (" ... ") && o.Sectors.Contains (" ... ") || o.Analyst.Contains (" ... ")) '? Не уверен, что именно вы передаете. – Greg

+0

@ Серви Действительно? Запрос «filterResult», в результате которого произошла ошибка, означает, что я не показывал, что я «делаю»? –

ответ

2

Возможно, я не понимаю этого (и не знаю вашу полную объектную модель), но не буду работа ...

var filteredResults = from d in db.Documents 
         where d.Sectors.Exists(sect => filterResearch.SelectedSectors.Contains(sect.Name)) 
          && d.Companies.Exists(comp => filterResearch.SelectedCompanies.Contains(comp.Name)) 
          && d.Analysts.Exists(anyst => filterResearch.SelectedAnalysts.Contains(anyst.Name)) 
         select d; 

Edit:. Просто добавить, я не пробовал этого в Visual Studio, поэтому он не может скомпилировать может быть, вам нужно использовать функцию, отличную от Exists - Any возможно - но я уверен, что вы получаете суть того, что я думаю.

+0

FYI - Мне пришлось использовать «Any». «Exists» не отображается в версии EF, которую я использую. –

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