2015-04-20 3 views
0

Considérons la requête suivante:filtre entité enfant méthodes LINQ

IQueryable<Employee> ret = this.ObjectContext.Employees 
      .Include("EmployeeInformation") 
      .Include("LatestInformation") 
      .Where(emp => emp.idJobTitle == 1 && emp.idCrtLoc == 1); 

L'entité Employees ne dispose pas d'une propriété de navigation à l'entité de LatestInformation (donc je ne peux pas accéder directement à l'autre entité), mais le LatestInformation possède une propriété de navigation pour l'entité Employés.

Comment puis-je filtrer l'entité LatestInformation de cette requête?

La requête attendue devrait ressembler à ceci:

ret = ret.Where(r=> LatestInformation.Where(li => li.year == 2015)); // Ofcourse this piece of code is wrong. 

Ainsi, la question était de savoir comment filtrer l'entité LatestInformation?

Répondre

0

S'il n'existe aucune propriété de navigation de Employee à LatestInformation, interrogez-la dans l'autre sens. Quelque chose comme:

var ret = this.ObjectContext.LatestInfomration 
    .Where(i => i.Employee != null && i.year == 2015) 
    .Select(i => i.Employee) 
    .Where(emp => emp.idJobTitle == 1 && emp.idCrtLoc == 1); 

Edité pour correspondre OP commentaire ci-dessous:

// Extract needed data: 
var employeeIdListWithInfo = this.ObjectContext.LatestInfomration 
    .Where(i => i.Employee != null) 
    .Select(i => i.Employee.Id) 
    .ToList(); 

// Build the query (not executed yet) 
var employeeWithInformation = this.ObjectContext.LatestInfomration 
    .Where(i => i.Employee != null && i.year == 2015) 
    .Select(i => i.Employee) 
    .Where(emp => emp.idJobTitle == 1 && emp.idCrtLoc == 1); 

var lonelyEmployees = this.ObjectContext.Employee 
    .Where(emp => !employeeIdListWithInfo.Contains(emp.Id)); 

var ret = employeeWithInformation.Union(lonelyEmployees); 
+0

Je sais, mais le but de la requête est de récupérer les données des employés ainsi que les autres données qui peuvent ou peuvent ne pas exister. – Alex

+0

En fait, si j'utilise cette approche, je devrais en quelque sorte faire la requête en tant que LEFT JOIN qui conviendrait à mes besoins .. ai-je raison? – Alex

+0

@Alex Voulez-vous dire que vous voulez aussi que 'Employee 'ne possède aucune entrée' LastInformation'? – Askolein

0

Que voulez-vous dire par la propriété de navigation?

Si ses quelque identifiant unique alors vous pouvez utiliser

List<int> latest = this.ObjectContext.LatestInformation.Select(lat=> lat.someid).ToList(); 

ret = ret.Where(r=> latest.Contains(ret.id)).Where(emp => emp.idJobTitle == 1 && emp.idCrtLoc == 1);