2012-04-29 8 views
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; 
} 

EDIT:

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

答えて

0

単純なクエリであることあなたが行うことができます。

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

SiteLoggersとサイトとの間の関係がある場合、あなたは「ドンサイトが存在することを確認する必要はありません。あなたはIDによる検索場合も

.... 
site.SiteLoggers = site.SiteLoggers.Where(x => !x.Deleted).ToList(); 
.... 

それはSingleOrDefaultを使用することをお勧めしますので、あなたは、同じIDを持つどの2つの要素が存在しないことを確認している意味:

+0

こんにちは。あなたの例では、クエリは単にサイトではなくSiteLoggersのコレクションを返しますが、私はSiteLoggersコレクションを介してサイトを取得できると言っていますか?私はvar siteLoggers = _context.SiteLoggers.Where(x => x.SiteID == siteID &&!x.Deleted); サイトサイト= null; if(siteLoggers!= null) site = siteLoggers.FirstOrDefault()。サイト。 リターンサイト。 – Matt

+0

もちろん、そうすることはできますが、そうすることはできません。 DbContextまたはObjectContextを使用していますか?事は少し違う。 eager loading、lazy loading、explciit loadingについて読むべきです。また、あなたのモデルによって異なります。サイトとサイトログの関係は存在しますか?どのような関係。完全な答えを得るために欠けている情報がたくさんあります – JotaBe

+0

こんにちは。私はDbContextを使用しています。はい、あなたはPOCOで見ることができるような関係があります。私は専門家ではありませんが、熱心で怠け者で明示的な読み込みについていくつかの研究を行いました。だから私はもともとincludeメソッドを使っていたのですが、それは5人程度しかないということを考えれば、関連するSiteLoggersを熱心に読み込むのは良い考えでしたか? – Matt

1

あなたの方法は、私はあなたがx.SiteID == siteIDのためだけの余分なチェックを持っていると思う結構ですFirstOrDefaultの代わりに、1つのIDを持つ複数の項目がある場合に例外をスローします。

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

良い点。ありがとう! – Matt

+0

@Matt、これが助けになるなら、それをアップヴォートするか答えとして受け入れることができます。 –

+0

こんにちは。それをしました。他の投稿に対する私のコメントについてどう思いますか? – Matt

関連する問題