Entity framework 使用实体框架筛选相关实体

Entity framework 使用实体框架筛选相关实体,entity-framework,filtering,Entity Framework,Filtering,我正在寻找加载和筛选相关子实体的最佳方法。我有一些有效的方法,但我不确定这是实现我想要的最好的方法还是正确的方法。下面的工作代码示例。赞成和反对都会很好!谢谢 public Site Find(int siteID) { // Can't use include here, not possible to filter related (child) entities // return _context.Sites.Where(x => x.ID == siteID)

我正在寻找加载和筛选相关子实体的最佳方法。我有一些有效的方法,但我不确定这是实现我想要的最好的方法还是正确的方法。下面的工作代码示例。赞成和反对都会很好!谢谢

public Site Find(int siteID)
{
    // Can't use include here, not possible to filter related (child) entities
    // return _context.Sites.Where(x => x.ID == siteID)
    //                      .Include("SiteLoggers")
    //                      .Where(x => x.Deleted == false)
    //                      .FirstOrDefault();

    var site = _context.Sites.Where(x => x.ID == siteID).FirstOrDefault();

    if(site != null)
    {
        site.SiteLoggers = site.SiteLoggers.Where(x => x.SiteID == siteID && 
                                                       x.Deleted == false)
                                           .ToList();
    }

    return site;
}
编辑:

新增POCO

public class Site
{
    public int ID { get; set; }
    public int LocationID { get; set; }
    public bool Active { get; set; }
    public bool Deleted { get; set; }
    public string Name { get; set; }
    public virtual Location Location { get; set; }
    public virtual ICollection<SiteLogger> SiteLoggers { get; set; }
    public virtual ICollection<LinkDcSite> DcSiteLinks { get; set; }
}

public class SiteLogger
{
    public int ID { get; set; }
    public int UID { get; set; }
    public int SiteID { get; set; }
    public int LocationID { get; set; }
    public string Name { get; set; }
    public bool Active { get; set; }
    public bool Deleted { get; set; }
    public virtual Site Site { get; set; }
    public virtual Location Location { get; set; }
    public virtual ICollection<SiteLoggerSensor> SiteLoggerSensors { get; set; }
    public virtual ICollection<LinkLoggerSiteLogger> LinkLoggerSiteLogger { get; set; }
}
公共类站点
{
公共int ID{get;set;}
public int LocationID{get;set;}
公共bool活动{get;set;}
公共bool已删除{get;set;}
公共字符串名称{get;set;}
公共虚拟位置{get;set;}
公共虚拟ICollection站点记录器{get;set;}
公共虚拟ICollection DcSiteLinks{get;set;}
}
公共类站点记录器
{
公共int ID{get;set;}
公共int-UID{get;set;}
public int SiteID{get;set;}
public int LocationID{get;set;}
公共字符串名称{get;set;}
公共bool活动{get;set;}
公共bool已删除{get;set;}
公共虚拟站点站点{get;set;}
公共虚拟位置{get;set;}
公共虚拟ICollection SiteLoggerSensors{get;set;}
公共虚拟ICollection LinkLoggerSiteLogger{get;set;}
}

您可以通过一个简单的查询:

var site = _context.SiteLoggers.Where(sl => sl.SiteId = siteId && !sl.Deleted).ToList();

如果站点记录器和站点之间存在关系,则不需要检查站点是否存在。

您的方法很好,我认为您只需额外检查
x.SiteID==SiteID

....
site.SiteLoggers = site.SiteLoggers.Where(x => !x.Deleted).ToList();
....
另外,如果按ID搜索意味着您确定没有两个元素具有相同的ID,那么最好使用SingleOrDefault而不是FirstOrDefault,以便在有多个项具有一个ID的情况下引发异常

var site = _context.Sites.Where(x => x.ID == siteID).SingleOrDefault();

你好在您的示例中,您的查询只返回一个SiteLogger集合,而不是一个站点,但您是说我可以通过SiteLogger集合获取该站点吗?即var siteLoggers=_context.siteLoggers.Where(x=>x.SiteID==SiteID&&!x.Deleted);Site=null;如果(siteLoggers!=null)site=siteLoggers.FirstOrDefault().site;返回站点;当然可以,但不是那样。您使用的是DbContext还是ObjectContext?事情有点不同。您应该阅读关于快速加载、延迟加载和解释加载的内容。这也取决于你的型号。站点和站点记录器之间是否存在关系?什么样的关系。有很多缺失的信息需要给出完整的答案。我正在使用DbContext。是的,正如你在POCO中看到的那样,有一种关系。我不是专家,但我做了一些关于渴望、懒惰、显式加载的研究。这就是我最初使用include方法的原因,因为考虑到只有5个左右的站点记录者,急切地加载相关的站点记录者似乎是一个好主意?@Matt,如果这对你有帮助,你可以投票表决,或者接受它作为答案。嗨。我们已经这样做了。你觉得我在另一篇帖子上的评论怎么样?如果你需要
网站
,你不应该从它的孩子那里得到它。