Tengo un problema al construir una consulta de linq bastante fuerte. Básicamente, tengo una situación en la que necesito ejecutar una subconsulta en un bucle para filtrar el número de coincidencias que se devuelven desde la base de datos. código de ejemplo es en este bucle a continuación:múltiplo de Linq donde consultas
foreach (Guid parent in parentAttributes)
{
var subQuery = from sc in db.tSearchIndexes
join a in db.tAttributes on sc.AttributeGUID equals a.GUID
join pc in db.tPeopleIndexes on a.GUID equals pc.AttributeGUID
where a.RelatedGUID == parent && userId == pc.CPSGUID
select sc.CPSGUID;
query = query.Where(x => subQuery.Contains(x.Id));
}
Cuando posteriormente que llamo el ToList() en la variable de consulta parece que sólo una sola de las subconsultas se ha realizado y me quedo con un cubo de datos Yo no requiero Sin embargo, este enfoque funciona:
IList<Guid> temp = query.Select(x => x.Id).ToList();
foreach (Guid parent in parentAttributes)
{
var subQuery = from sc in db.tSearchIndexes
join a in db.tAttributes on sc.AttributeGUID equals a.GUID
join pc in db.tPeopleIndexes on a.GUID equals pc.AttributeGUID
where a.RelatedGUID == parent && userId == pc.CPSGUID
select sc.CPSGUID;
temp = temp.Intersect(subQuery).ToList();
}
query = query.Where(x => temp.Contains(x.Id));
Desafortunadamente, este enfoque es desagradable, ya que da lugar a varias consultas a la base de datos remota mediante el cual el planteamiento inicial si podía conseguir que funcione solamente resultaría en un solo golpe. ¿Algunas ideas?
+1 Si quiere entender más este concepto, mire la respuesta de Skeet aquí y el artículo al que se hace referencia. http://stackoverflow.com/questions/271440/c-sharp-captured-variable-in-loop –
@DMoses gracias, agregué algunos enlaces, reconociendo totalmente que no soy capaz de explicar esto tan elegante y preciso como los caballeros Lippert y Skeet :-) – driis
Gracias driis. Trabajado como un encanto. Eres un santo y un erudito señor. – kh25