2

我正在寻找加载和过滤相关子实体的最佳方法。我有一些有用的东西,但我不确定它是否是实现我想要的最好甚至正确的方法。下面的工作代码示例。优点和缺点都会很棒!谢谢!

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;
}

编辑:

添加了 POCOS

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; }
}
4

2 回答 2

1

您的方法很好,我认为您需要额外检查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();
于 2012-04-29T23:12:50.357 回答
0

你可以通过一个简单的查询来做到这一点:

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

如果 SiteLoggers 和 Sites 之间存在关系,则无需检查该站点是否存在。

于 2012-04-29T23:05:32.143 回答