首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何筛选导航属性中的数据

如何筛选导航属性中的数据
EN

Stack Overflow用户
提问于 2019-07-10 02:57:34
回答 1查看 54关注 0票数 0

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

代码语言:javascript
复制
// 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; }
}

问题是,我想从表格表中包括状态的整个数据,但我也想过滤状态表中的数据,如果今天早于到期日期。

这是我尝试过的方法,但没有任何响应。

代码语言:javascript
复制
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();  
EN

回答 1

Stack Overflow用户

发布于 2019-07-10 03:16:31

没有办法在一个查询中做到这一点。之后,您将需要显式加载Statuses关系:

代码语言:javascript
复制
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看来,就好像您从集合中删除了所有其他状态)。出于这个原因,最好在初始查询中禁用跟踪,以便在您意外忘记并尝试保存时会更明显地发现某些不正确的地方:

代码语言:javascript
复制
var form = await _context.Forms
    .Include(t => t.FormTopics)
    .ThenInclude(q => q.Questions)
    .AsNoTracking()
    .ToListAsync();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56959061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档