【问题标题】:Linq To Entities - Filter on listLinq To Entities - 筛选列表
【发布时间】:2017-03-20 02:14:30
【问题描述】:

我真的在努力为某些特定数据使用某种形式的过滤方法。过滤设备(参见下面的课程)而不用担心过滤子 List<DeviceQueue> 可以按预期完美工作。但是,当我尝试过滤说 MessageId 和/或 SequenceId 时,结果会返回 MessageQueue 表中的所有条目,而忽略我的过滤器。

查看设备的 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 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;
    }

【问题讨论】:

  • 你不知道你想要达到什么目的。
  • 我的错,确实缺少信息。现在看看 :) 谢谢 :)
  • 还是不清楚。你不必把你的真实项目放在这里,而是放一个minimal演示。
  • 抱歉,发布此内容已经很晚了。我会改写我的帖子并更新。

标签: c# sql entity-framework linq linq-to-entities


【解决方案1】:

您可以按如下方式添加谓词:

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

MessageId 相同。

【讨论】:

  • 感谢您的帖子,在设计时一切都很好并且没有错误,但是我的结果表明它没有使用 sequenceId 作为过滤器。它返回该设备的所有消息队列项。
  • 将此标记为答案。我对 Any() 的理解是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 2018-02-20
  • 2016-04-17
相关资源
最近更新 更多