2017-10-12 4 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); 

작동하지 않습니다.

기본적으로 모든 부모 하위를 포함하려고 시도하지만 내림차순으로 정렬 한 다음 첫 번째 자식 (예 : 최신 자식)이 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- 엔티티 엔티티 프레임 워크를 사용하고 있다고 가정합니다.

부모와 자식 간의 일대 다 관계를 모델링 한 것처럼 보입니다. 모든 부모는 0 이상의 자식을 가지며 모든 자식은 정확히 하나의 부모에 속합니다.

또한 다 대 다 관계 일 수 있습니다. 클래스는 약간 다릅니다 (데이터베이스에 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]는 무엇을 의미할까요?

기본적으로, 모든 부모가 자녀를 포함하려고하지만, 순서 이를 확인 후 ID의 하강에 의해 :

게다가,이 컬렉션 (SO: Understanding code first virtual properties 참조) 가상해야

당신은 썼다 첫 번째 예 (최신 항목 인 경우) 이 == false 및 timeSpan == null을 가져 왔으며이 조건을 충족하는 하위가있는 상위 행만 포함하십시오.

약간 어려운 이해, 그러나 당신이 부모의 순서가 보인다, 당신은 가장 높은 ChildId와 아이가 수입 및 null 타임 스팬을 가지고 있지 않습니다 만 부모와 자녀를 원한다.

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