Linq To Entities - 按列表过滤
Linq To Entities - Filter on list
我真的很难为某些特定数据使用某种形式的过滤方法。在设备上过滤(参见下面的 class)而不用担心在子设备上过滤 List<DeviceQueue>
可以按预期完美工作。但是,当我尝试过滤 MessageId and/or SequenceId 结果 returns MessageQueue table 中的所有条目时,忽略了我的过滤器。
请参阅 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; }
参见过滤方法(根据第一个建议答案更新):
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;
}
您可以按如下方式添加谓词:
if (SequenceId.HasValue)
{
device = device.Where(d => d.MessageQueue
.Any(q => q.SequenceId == SequenceId.Value));
}
同MessageId
。
我真的很难为某些特定数据使用某种形式的过滤方法。在设备上过滤(参见下面的 class)而不用担心在子设备上过滤 List<DeviceQueue>
可以按预期完美工作。但是,当我尝试过滤 MessageId and/or SequenceId 结果 returns MessageQueue table 中的所有条目时,忽略了我的过滤器。
请参阅 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; }
参见过滤方法(根据第一个建议答案更新):
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;
}
您可以按如下方式添加谓词:
if (SequenceId.HasValue)
{
device = device.Where(d => d.MessageQueue
.Any(q => q.SequenceId == SequenceId.Value));
}
同MessageId
。