2016-11-06 3 views
0

저는 특정 데이터에 대해 필터 방법의 일부 형식을 활용하기 위해 정말로 싸우고 있습니다. 하위 필터링에 대한 걱정없이 장치 필터링 (아래 클래스 참조) List<DeviceQueue>은 예상대로 완벽하게 작동합니다. 그러나 MessageId 및/또는 SequenceId에서 필터링하려고하면 결과는 내 필터를 무시하고 MessageQueue 테이블의 모든 항목을 반환합니다. 장치에 대한Linq To Entities - 목록의 필터

참조 Data.Model : DeviceQueue에 대한

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

참조 Data.Model :

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

내 잘못, 실종 된 정보. 지금보십시오 :) thanks – 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