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 を持つ要素が 2 つ存在しないことが確実になるため、FirstOrDefault の代わりに SingleOrDefault を使用して、1 つの 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 に答える