У меня проблема, создающая довольно внушительный запрос linq. В основном у меня есть ситуация, когда мне нужно выполнить подзапрос в цикле, чтобы отфильтровать количество совпадений, возвращаемых из базы данных. Пример кода в этом цикле ниже:Linq multiple where queries
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));
}
Когда я впоследствии вызвать ToList() на переменной запроса представляется, что только один из подзапросов была выполнена, и я остался с ведром данных Я не требую. Однако этот подход работает:
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));
К сожалению, такой подход противный, как это приводит к множеству запросов к удаленной базе данных, при этом первоначальный подход, если я мог бы получить его работу приведет лишь один удар. Есть идеи?
+1 Если вы хотите больше понять эту концепцию, посмотрите на ответ Скита здесь и его статью, на которую ссылается. http://stackoverflow.com/questions/271440/c-sharp-captured-variable-in-loop –
@DMoses спасибо, я добавил несколько ссылок, полностью признав, что я не могу объяснить это как изящный и точный, как джентльмены Lippert и Skeet :-) – driis
Спасибо, driis. Работал как шарм. Вы святой и ученый, сэр. – kh25