假设我有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();
答案 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();