如何在导航属性中过滤数据

时间:2019-07-09 18:57:34

标签: c# asp.net asp.net-core

假设我有2个表格“ Form”和“ Status”。表单表包含一些属性以及引用状态表的导航属性。

// Form table model
public class Form
{
    ...Some properties,
    public ICollection<Status> Statuses { get; set; }
}
// Status table model
public class Status
{     
    ...Some properties,  
    public DateTime FormTimeStart { get; set; }
    public DateTime FormTimeFinish { get; set; }
}

问题是,我希望从Form表中获得包括Status在内的所有数据,但是如果今天早于到期日期,我还希望从Status表中过滤出数据。
这是我尝试过的,但是无法给出任何回应。

var form = _context.Forms
                 .Include(s => s.Statuses.Where  
                   (i => DateTime.Compare(DateTime.Now,i.FormTimeFinish) < 0))
                 .Include(t => t.FormTopics)
                 .ThenInclude(q => q.Questions)
                 .ToList();  

1 个答案:

答案 0 :(得分:0)

无法在单个查询中执行此操作。在发生以下情况后,您需要显式加载Statuses关系:

var form = await _context.Forms
             .Include(t => t.FormTopics)
             .ThenInclude(q => q.Questions)
             .ToListAsync();

form.Statuses = await _context.Entry(form)
    .Collection(x => x.Statuses).Query()
    .Where(i => DateTime.Compare(DateTime.Now, i.FormTimeFinish) < 0))
    .ToListAsync();

但是,请非常注意这一点,因为您只有一部分状态。因此,如果您进行任何类似尝试保存表单的操作,最终将删除该列表中未包含的任何内容(它将看起来像EF,就像您从集合中删除了所有其他状态一样)。出于这个原因,最好在初始查询中禁用跟踪,这样一来,如果您不小心忘记了并尝试保存,就会更明显地发现某些错误是不正确的:

var form = await _context.Forms
    .Include(t => t.FormTopics)
    .ThenInclude(q => q.Questions)
    .AsNoTracking()
    .ToListAsync();