2017-10-12 127 views
0

我有以下的(簡化)設置:C#LINQ到實體包括與條件和訂購

Public class parent 
{ 
    public string name{get;set;} 

    public list<child> childList {get;set;} 
} 


Public class child 
{ 
    public int id {get;set;} 

    public bool imported{get;set;} 

    public dateTime? timeSpan {get;set;} 
} 

,我有這個疑問:

var relevant = context.parent 
       .include(x => x.child.OrderByDescending(y => y.id).FirstOrDefaultAsync(z => z.imported == false && timeSpan == null) 
       .Where(x => x.child != null); 

不工作。

基本上,我想包括所有的父母孩子,但爲了他們的ID下降,然後檢查是否第一個(例如最新的一個)具有imported == falsetimeSpan == null,並且只包括有一個孩子的父行是符合這個條件。

我知道我可以做到這一點:

var relevant = context.parent 
       .include(x => x.child); 

,然後提取我需要的數據,但有可能使用LINQ做一個?

+0

也許相關https://stackoverflow.com/questions/32751427/conditional-include-in-entity-framework – OmG

回答

1

正如你使用的標籤linq-to-entities我假設你正在使用實體框架。

在我看來,你已經模仿父母與子女之間的一個一對多的關係:每一位家長都有零個或多個孩子,而每個孩子都屬於一個母公司。

這也可能是因爲你有很多一對多的關係。該班略有不同(和數據庫將有你不要在您的DbContext有一個額外的表),但問題依舊。

這可能是因爲你的簡化,但我看到你的類中的某些奇怪的事情,可能會導致您的問題。

public class Parent 
{ 
    public int Id {get;set;} 
    public string name{get;set;} 

    // Every parent has zero or more Children 
    public virtual ICollection<Child> Children {get;set;} 
} 

public class Child 
{ 
    public int id {get;set;} 
    public bool Imported{get;set;} 
    public DateTime? TimeSpan {get;set;} 

    // every Child belongs to exactly one Parent using foreign key 
    public int ParentId {get; set;} 
    public Parent Parent {get; set;} 
} 

兒童的父集合不能是一個列表:

在實體框架如下適當的一個一對多的關係進行建模。 ChildList [3]意味着什麼?

此外,該系列應該是虛擬的(見SO: Understanding code first virtual properties

您寫道:

基本上,我想包括所有的父母孩子,但爲了 他們的ID下降,然後檢查如果第一個(例如最新的一個) 先後引進== false,並且時間跨度== null,而只包括具有滿足該條件的孩子 父行。

有點難以理解,但似乎你有父母的序列,並且希望只有那些父母和他們的孩子,其中最高childID的孩子是不是進口的,並有一個空時間跨度。

var result = dbContext.Parents 
    .Select(parent => new 
    { 
     // Take all Parent properties you need in your end result, for example 
     Id = parent.Id, 
     Name = parent.Name, 
     Children = parent.Children 
      .OrderByDescending(child => child.Id), 
    }) 
    .Select(parent => new 
    { 
     Id = parent.Id, 
     Name = parent.Name, 
     Children = parent.Childrent, 
     NewestChild = parent.Children.FirstOrDefault(), 
    }) 
    // keep only the parents you want to keep: 
    .Where(parent => parent.NewestChild != null 
     && !parent.NewestChild.Imported 
     && parent.NewestChild.TimeSpan == null));