【问题标题】:Filtering Child Object with Multiple Criteria使用多个条件过滤子对象
【发布时间】:2016-02-11 10:53:30
【问题描述】:

我在过滤使用 linq 返回的记录时遇到问题。涉及的对象如下所示:

约会

public partial class Appointment
{
    public Appointment()
    {
        Callbacks = new HashSet<Callback>();
    }

    [Key()]
    public int AppointmentId { get; set; }
    public DateTime Start { get; set; }
    public DateTime? Deleted { get; set;}

    public virtual ICollection<Callback> Callbacks { get; set; }
}

回调

public partial class Callback
{
    [Key()]
    public int CallbackId { get; set; }
    public DateTime? Deleted { get; set; }
    public virtual Appointment Appointment { get; set; }

    public virtual User AssignedTo { get; set; }
}

用户

public partial class User
{
    public User()
    {
        Callbacks = new HashSet<Callback>();
    }

    [Key()]
    public int UserId { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string Ref { get; set; }

    public virtual ICollection<Callback> Callbacks { get; set; }
}

我正在尝试返回满足以下条件的记录:

  • 约会start日期必须等于searchDate
  • 约会未被删除
  • 约会start 日期不得与用户已有的任何约会发生冲突

我已尝试使用以下查询,但未返回任何结果(日期为 01/03/2016 (dd/mm/yyyy) 的约会可用。

public List<AppointmentSearchResultsViewModel> SearchByDate(DateTime searchDate, string userName)
{
    return _context.Appointments
        .Where(a =>
            a.Start.Date == searchDate
            && a.Deleted == null
            && a.Callbacks.Any(c =>
                !(c.Appointment.Start != a.Start
                && c.AssignedTo.Ref == userName
                && c.Deleted == null)
        ))
        .OrderBy(a => a.Start)
        .Select(a)
        .ToList();
}

谁能帮助我了解如何根据上述标准正确过滤?

编辑

尝试澄清模型:

  • 用户有回调
    • 回拨有约会

此查询的目的是搜索searchDate 上用户尚未在约会时间安排回叫的所有约会。

【问题讨论】:

  • 您的型号和您的代码不匹配。所以不清楚你在问什么。您是否尝试过滤回调或约会?这个 Linq 是如何编译的?
  • 您说的是“约会开始日期必须等于 searchDate”,然后您说的是“约会开始日期不得与用户已有的任何约会发生冲突”。怎么会?
  • @CetinBasoz 表示searchdate 尚未添加到任何用户约会中。
  • @CetinBasoz 我已经更新了问题,试图阐明查询的意图以及模型的工作原理。
  • 我写了一个 aswer,但如果其他人看到一些示例数据来了解你想要做什么,那就太好了。查询回调可能是多余的操作。

标签: c# asp.net-mvc entity-framework linq


【解决方案1】:

我认为您需要对您的 Any-statement 进行否定比较:

!a.Callbacks.Any(c =>
    (c.Appointment.Start == a.Start
    && c.AssignedTo.Ref == userName
    && c.Deleted == null)

因此,您只能从 a.Callbacks 获得具有不同 Start-date 的 Callbacks

此外,您可以在末尾省略Select(a)-语句并立即致电ToList

【讨论】:

  • 抱歉,回复晚了,谢谢,成功了。
【解决方案2】:

模型和你想要达到的目标对我来说并不是很清楚,但无论如何我都会尝试我的机会,在 O 可以理解的部分:

  return _context.Appointments
      .Where(a =>
          a.Start.Date == searchDate
          && a.Deleted == null
          && !a.Callbacks.Any(c =>
              (c.Appointment.Start == a.Start
              && c.AssignedTo.Ref == userName
              && c.Deleted == null)
      ))
      .OrderBy(a => a.Start)
      .ToList();

【讨论】:

    【解决方案3】:

    试试这个,让我知道你会得到什么回报......

    return context.Users.Where(user => user.Ref = userName)
                        .SelectMany(user => user.Callbacks)
                        .Where(cb => cb.Appointment.Deleted == null)
                        .Where(cb => cb.Appointment.Start == searchDate)
                        .Select(cb => cb.Appointment)
                        .ToList();
    

    这应该返回任何与searchDate 参数冲突的约会

    【讨论】:

    • 这不会过滤掉那些开始不等于当前实体之一的回调(参见“冲突条件”)
    • @HimBromBeere 没有当前实体...本质上他是在问如何找出用户在给定日期是否有任何约会,或者我错过了什么
    • OP 正在询问尚未添加到任何用户的给定日期的 ro 约会。我认为你错过了最后一点。顺便说一句:context 中没有 Users-property。
    • @HimBromBeere,但这肯定不对,他指定了一个用户名参数,他也在描述中写了这个The appointment start date must not clash with any appointments that the user already has
    • @AydinAdn,是的,这就是为什么我认为查询回调可能是多余的。似乎还没有人对此有明确的想法:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    相关资源
    最近更新 更多