2017-10-12 23 views
0

je la configuration suivante (simplifiée):C# LINQ à l'entité comprennent à la condition et la commande

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

et j'ai cette requête:

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

Ce qui ne fonctionne pas. Fondamentalement, j'essaye d'inclure tous les enfants de parents, mais les ordonne par ID descendant et vérifie alors si le premier (par exemple le plus nouveau) a imported == false et timeSpan == null, et inclut seulement les lignes de parent qui ont un enfant qui répond à cette condition.

Je sais que je pourrais le faire:

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

puis extraire les données dont j'ai besoin, mais est-il possible de le faire dans un LINQ?

+0

peut-être lié https://stackoverflow.com/questions/32751427/conditional-include-in-entity-framework – OmG

Répondre

1

Lorsque vous utilisez le tag linq-to-entities Je suppose que vous utilisez le framework d'entité. Il me semble que vous avez modélisé une relation un-à-plusieurs entre Parent et Enfant: chaque Parent a zéro ou plusieurs Enfants, et chaque Enfant appartient à exactement un Parent.

Il se peut aussi que vous ayez une relation plusieurs-à-plusieurs. Les classes sont légèrement différentes (et la base de données aura une table supplémentaire que vous n'avez pas dans votre DbContext), mais le problème reste le même.

Cela pourrait être dû à vos simplifications, mais je vois des choses étranges dans vos classes qui pourraient causer vos problèmes.

Dans le cadre d'une entité à-plusieurs appropriée est modelée comme suit:

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

La collection des enfants dans votre parent ne peut pas être une liste. Que signifierait ChildList [3]?

Par ailleurs, cette collection devrait être virtuelle (Voir SO: Understanding code first virtual properties)

Vous avez écrit:

Fondamentalement, je suis en train d'inclure tous les parents des enfants, mais pour les par id descendant puis vérifiez si le premier (par exemple le plus récent) a importé == false et timeSpan == null, et n'inclut que les lignes parent ayant un enfant répondant à cette condition.

Un peu difficile à comprendre, mais il semble que vous avez une séquence de parents, et que vous voulez que les parents et leurs enfants, où l'enfant le plus haut ChildID ne sont pas importées et a une TimeSpan nulle.

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