簡體   English   中英

根據子級條件的子級獲取父級對象,並包括

[英]Get parent object based on child of child criteria and include

好的,這是我的桌子的快速版本。

public class Line
{
  // Bunch Of properties
  // ...
  public List<Tool> Tools {get;set;}
}

public class Tool
{
  // Bunch Of properties
  // ...
  public List<Task> Tasks {get;set;}
}

public class Task
{
  // Bunch Of properties
  // ...
  public List<SchedItem> SchedItems {get;set;}
}

public class SchedItem
{
  public DateTime SchedDate {get;set;}
}

我想要的是一個查詢,該查詢將根據SchedItem.SchedDate是否在日期范圍內返回包括SchedItem.SchedDate等在內的所有Lines

我在LinqPad中嘗試了以下方法。

var line = (from p in Lines.Include(x => x.Tools.Select(m => m.Tasks.Select(s => s.SchedItems)))
                        from t in p.Tools
                        from m in t.Tasks
                        from s in m.SchedItems
                        where s.SchedDate >= StartDateQuery &&
                              s.SchedDate <= EndDateQuery 
                        select p);

這對我來說似乎是錯誤的,因為返回的數據包括所有SchedItems而不僅僅是基於查詢的那些。

更新1:是的,我想我的理解是錯誤的。 我在上下文配置中設置了以下內容

db.Configuration.LazyLoadingEnabled = false;
db.Configuration.ProxyCreationEnabled = false;

當我再次運行代碼時,我得到了33個沒有子項的Line項目的列表。 只能有多個子項的1個“行”項。

我將查詢更改為此,現在我得到了子項,但“ Line數”仍為33,這是錯誤的。

var line = (from p in Lines
                        from t in p.Tools
                        from m in t.Tasks
                        from s in m.SchedItems
                        where s.SchedDate >= StartDateQuery &&
                              s.SchedDate <= EndDateQuery 
                        select p).Include(x => x.Tools.Select(m => m.Tasks.Select(s => s.SchedItems)));

嘗試這個

var lines = Lines.Where(i => 
    i.Tools.Any(t => 
        t.Tasks.Any(y => 
            y.SchedItems.Any(u => 
                u.SchedDate >= StartDateQuery  && 
                s.SchedDate <= EndDateQuery 
            ) 
        )
    )
);

lines.ForEach(i => new 
{
    i.Tools = i.Tools.Where(t => 
                t.Tasks.Any(y => 
                    y.SchedItems.Any(u => 
                        u.SchedDate >= StartDateQuery  && 
                        s.SchedDate <= EndDateQuery 
                    ) 
                )
            );
    i.Tools.ForEach(t => new
    {
        t.Tasks = t.Tasks.Where(y => 
                        y.SchedItems.Any(u => 
                            u.SchedDate >= StartDateQuery  && 
                            s.SchedDate <= EndDateQuery 
                        ) 
                    );
    });
});

您的代碼由於使用了一對from語句而生成笛卡爾積。 我將跳過DbContext的配置,並假定您已啟用延遲加載。 嘗試這個:

var line = from p in ls
           where p.Tools
                .Any(to=> to.Tasks
                    .Any(ta=> ta.SchedItems
                       .Any(s=> s.SchedDate >= StartDateQuery && s.SchedDate <= EndDateQuery)));
           select p;

實現目標的另一種方法是添加權限:SchedItem,Task,Tool,找到滿足您要求的SchedItem,並通過父級導航到Line。 欲了解更多信息,請點擊這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM