2015-02-06 2 views
0

Я работал над запросом linq в течение нескольких часов, но не получал его на работу.Вложенный запрос linq с содержит

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

У меня есть DbSet, и в комнате есть список объектов, и у каждого объекта есть собственный идентификатор.

Таким образом, мой метод принимает список объектов объекта (IEnumerable), и я хочу вернуть все номера, соответствующие списку объектов.

Так я думал, что мой запрос может выглядеть следующим образом:

var rooms = DbSet.Include("Facility").Where(room => room.Facility.All(facility => facilityIds.Contains(facility.Id))); 

Но этот запрос дает мне другие результаты, чем ожидалось. Кто-нибудь может помочь мне с этим вопросом?

Обновление образца

  var filterIds = new int[] {1,2}; 

      var facilities1 = new List<Facility> {new Facility() {Id = 1}}; 
      var facilities2 = new List<Facility> {}; 
      var facilities3 = new List<Facility> {new Facility() {Id = 1}, new Facility() {Id = 2}}; 

      var basicData = new List<Room>() 
      { 
       new Room() {Id = 1, Facility = facilities1}, 
       new Room() {Id = 2, Facility = facilities2}, 
       new Room() {Id = 3, Facility = facilities1}, 
       new Room() {Id = 4, Facility = facilities3}, 
       new Room() {Id = 5, Facility = facilities1}, 
       new Room() {Id = 6, Facility = facilities1}, 
      }; 

      var result = basicData.Where(r => (!filterIds.Any() || r.Facility.All(f => filterIds.Contains(f.Id)))); 

Этот запрос дает мне 6 результатов и я ожидаю только комнату с идентификатором 4.

+1

Вы можете создать пример, который воспроизводит поведение, которое вы видите, показать ожидаемый и фактический выход? Вы можете заменить 'DbSet.Include (« Facility »)' на 'List '. – CodeCaster

+0

Работа над этим образцом – ChristiaanV

ответ

3

Будет ли эта работа?

rooms.Where(
    room => room.Facilities.Any() 
      && filterIds.All(x => room.Facilities.Any(o => o.Id == x)) 
); 

Update Обновлено скрипку с образцами данных. Возвращает комнату 4, как и ожидалось, для объектов 1,2. Возвращает номер 1,3,4,5,6 для всего объекта 1:

Fiddle: https://dotnetfiddle.net/b24FbF

+0

Работает как очарование! – ChristiaanV

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