Últimamente hemos trabajado mucho con LINQ, principalmente en un sentido LINQ-to-Objects. Desafortunadamente, algunas de nuestras consultas pueden ser un poco complicadas, especialmente cuando comienzan a involucrar múltiples secuencias en combinaciones. Puede ser difícil saber exactamente lo que está pasando, cuando recibe consultas que comienzan a parecerse a:Depuración de consultas LINQ
IEnumerable<LongType> myCompanies = relevantBusiness.Children_Companies
.Select(ca => ca.PR_ContractItemId)
.Distinct()
.Select(id => new ContractedItem(id))
.Select(ci => ci.PR_ContractPcrId)
.Distinct()
.Select(id => new ContractedProdCompReg(id))
.Select(cpcr => cpcr.PR_CompanyId)
.Distinct();
var currentNewItems = myCompanies
.Where(currentCompanyId => !currentLic.Children_Appointments.Select(app => app.PR_CompanyId).Any(item => item == currentCompanyId))
.Select(currentId => new AppointmentStub(currentLic, currentId))
.Where(currentStub=>!existingItems.Any(existing=>existing.IsMatch(currentStub)));
Items = existingItems.Union(newItems).ToList();
etc, etc ...
Incluso cuando se depura, puede ser difícil saber quién está haciendo qué a quién y cuándo. A menos que llame innecesariamente a "ToList" en secuencias para obtener cosas que pueda examinar más fácilmente, ¿alguien tiene alguna buena sugerencia sobre cómo depurar LINQ "complicado"?
+1 para la refacturación del LINQ mess. –
cordialmente de acuerdo. Con LinqToObjects cada paso en la cadena realmente le dará un objeto para trabajar y examinar. A diferencia de LinqToSQL, donde la evaluación de expresión se retrasa hasta el final, los métodos de extensión en LinqToObjects funcionan igual que otros métodos y se evalúan inmediatamente. – tvanfosson
Las consultas de LINQ to Object también utilizan la evaluación deferida. Pero puedes evaluarlos durante la depuración. –