0
votes

Table de référencement LINQ Sélectionner une requête

J'ai une table d'employés auto-référençant, ce qui signifie qu'il y a des employés avec une clé primaire «employé» et une clé étrangère «supervisible» pour le parent (superviseur). Les gestionnaires sont au-dessus de l'hirarchie, leur superviseur est donc NULL. Il y a aussi une colonne de date (créée), de filtrer pour des dates spécifiques, mais seuls les gestionnaires ont une date et non de leurs employés. J'essaie d'obtenir tous les résultats d'une date, des gestionnaires et de leurs employés spécifiques, mais je ne peux tout simplement pas le faire courir. Je dois y parvenir avec Linq, mais je pensais que je pourrais une requête SQL d'abord, de voir si je suis en quelque sorte capable de migrer cela sur une requête LINQ (peu importe la syntaxe). Mais c'était très dellusionnel, une fois que j'ai réalisé que c'est aussi difficile que dans Linq ... Je pensais que cela pourrait être atteint avec un CTE, mais je ne peux pas avoir la référence de soi-même. Soit je viens de recevoir des gestionnaires ou rien ... Voici un exemple de table:

------------------------------------------------------
|EmployeeID|Name    |SupervisorID|CreatedOn          |
|1         |Sanders |NULL        |2019-01-01 16:20:33|
|2         |Flanders|1           |NULL               |
|3         |Andrews |1           |NULL               |
------------------------------------------------------


0 commentaires

3 Réponses :


0
votes

Utilisation d'une jointure, vous pouvez avoir des gestionnaires et leurs subordonnés:

var list = employees.Where(m=> m.CreatedOn >= new DateTime(2019,1,1) && m.CreatedOn < new DateTime(2019,1,2)).Join(employees,sc=> sc.EmployeeId, soc=> soc.SupervisorId, (sc,soc)=> new {left= sc, right=soc}  ).ToList();


1 commentaires

Les réponses uniquement des liaisons sont découragées. À mesure que les liens se détériorent, la réponse devient uninformatif.



2
votes

Regardons les superviseurs et les employés séparément, puis fusionner les deux plus tard.

superviseurs strong> p>

Pour un superviseur, la logique est assez simple, vous filtrez-vous La date de création. p> xxx pré>

Remarque: Dans votre jeu de données, seuls les superviseurs ont une date de création. Si les employés peuvent également avoir une date de création, vous devez les filtrer explicitement: P>

var fromDate = new DateTime(2019,1,1);
var untilDate = new DateTime(2019,1,2);

var supervisorsAndSubordinates = employees
                         .Where(e => 
                                  // Supervisor filter
                                  (
                                       e.CreatedOn >= fromDate 
                                    && e.CreatedOn < untilDate
                                  )
                                  ||
                                  // Subordinate filter
                                  (
                                       e.SupervisorID != null
                                    && e.Supervisor.CreatedOn >= fromDate 
                                    && e.Supervisor.CreatedOn < untilDate
                                  ))
                         .ToList();


1 commentaires

Cette solution est très élégante et résout mon problème :) Cependant, au lieu de "E.Supervisid! = Null" il devrait être "E.Supervisor! = Null". Merci beaucoup!