2016-11-06 20 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; } 
} 

DeviceQueueを参照Data.Model:

 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

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

は、フィルタ法(第一提案答え、次の更新)を参照してください。次のように述語を追加できます。

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

MessageIdと同じです。

+0

投稿していただきありがとうございます。設計時とエラーなしで効果がありますが、私の結果はsequenceIdをフィルタとして使用していないことを示しています。そのデバイスのすべてのメッセージキュー項目を返します。 – David

+0

答えとしてマークします。 Any()の理解が間違っていた – David

関連する問題