2016-11-06 3 views
0

Я действительно борюсь за использование какой-либо формы метода фильтрации для некоторых конкретных данных. Фильтрация на устройстве (см. Класс ниже), не беспокоясь о фильтрации на ребенке List<DeviceQueue> работает отлично, как ожидалось. Однако, когда я пытаюсь фильтровать, например, MessageId и/или SequenceId, результат возвращает все записи в таблице MessageQueue, игнорируя мой фильтр.Linq To Entities - Отфильтровать по списку

См Data.Model для устройства:

public class Device : EntityBase 
{ 
    public string SerialNumber { get; set; } 
    public virtual DeviceType DeviceType { get; set; } 
    public virtual List<DeviceQueue> MessageQueue { get; set; } 
} 

См Data.Model для DeviceQueue:

public class DeviceQueue : EntityBase 
{ 
    public string MessageId { get; set; } 
    public Int32 SequenceId { get; set; } 

См Метод фильтра (обновлен после 1-го предложенного ответа):

 public IQueryable<Device> Filter(IQueryable<Device> device) 
    { 

     IQueryable<DeviceQueue> deviceQueue = Enumerable.Empty<DeviceQueue>().AsQueryable(); 

     //Because it is IQueryable, the data is not fetched until you bind it so it only pulls the data you need. 
     if (DeviceId != null) 
     { 
      device = device.Where(d => d.Id == DeviceId); 
     } 

     if (SequenceId != null) 
     { 
      device = device.Where(d => d.MessageQueue.Any(q => q.SequenceId == SequenceId.Value)); 
     } 

     if (MessageId != null) 
     { 
      device = device.Where(d => d.MessageQueue.Any(q => q.MessageId == MessageId)); 
     } 

     return device; 
    } 
+2

Вы не говорите, чего вы пытаетесь достичь. –

+0

Моя плохая, пропавшая информация действительно. Смотрите сейчас :) спасибо :) – David

+0

Все еще непонятно. Вам не нужно ставить свой настоящий проект здесь, вместо этого ставьте ** минимальную ** демоверсию. –

ответ

1

Вы можете добавить предикат следующим образом:

if (SequenceId.HasValue) 
{ 
    device = device.Where(d => d.MessageQueue 
         .Any(q => q.SequenceId == SequenceId.Value)); 
} 

То же самое с MessageId.

+0

Спасибо за сообщение, все отлично работает во время разработки и никаких ошибок, однако мой результат показывает, что он не использует sequenceId в качестве фильтра. Он возвращает все элементы сообщения для этого устройства. – David

+0

Отметить это как ответ. Мое понимание Any() неверно. – David