Tôi gặp sự cố khi xây dựng một truy vấn LINQ khá tốn kém. Về cơ bản tôi có một tình huống mà theo đó tôi cần phải thực hiện một truy vấn phụ trong một vòng lặp để lọc xuống số lượng các trận đấu được trả về từ cơ sở dữ liệu. mã ví dụ là trong vòng lặp này dưới đây:LINQ nhiều nơi truy vấn
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));
}
Khi tôi sau đó gọi ToList() trên các biến truy vấn có vẻ như chỉ có một một trong những truy vấn con đã được thực hiện và tôi là trái với một xô dữ liệu Tôi không yêu cầu. Tuy nhiên phương pháp này hoạt động:
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));
Đáng tiếc là phương pháp này là khó chịu vì nó dẫn đến nhiều truy vấn đến các cơ sở dữ liệu từ xa, theo đó các phương pháp tiếp cận ban đầu nếu tôi có thể có được nó làm việc sẽ chỉ dẫn đến một hit duy nhất. Bất kỳ ý tưởng?
+1 Nếu bạn muốn hiểu khái niệm này nhiều hơn, hãy xem câu trả lời của Skeet tại đây và bài viết được tham chiếu của anh ấy. http://stackoverflow.com/questions/271440/c-sharp-captured-variable-in-loop –
@DMoses cảm ơn, tôi đã thêm một số liên kết, thừa nhận đầy đủ rằng tôi không thể giải thích điều này là thanh lịch và chính xác như các quý ông Lippert và Skeet :-) – driis
Cảm ơn bạn driis. Làm việc như người ở. Bạn là một vị thánh và một học giả. – kh25