Tôi đã có tình huống sau đây:Lấy số lượng lớn các bản ghi dưới nhiều hạn chế, mà không gây ra một ngoại lệ out-of-bộ nhớ
Có hai loại liên quan. Đối với câu hỏi này, tôi sẽ sử dụng các loại đơn giản sau đây:
public class Person { public Guid Id {get; set;} public int status {get; set;} } public class Account { public Guid AccountId {get; set;} public decimal Amount { get; set; } public Guid PersonId { get; set; } }
Vì vậy mà một
Person
có thể có nhiềuAccount
s (ví dụ, nhiềuAccount
s sẽ tham khảo cùngPersonId
).Trong cơ sở dữ liệu của chúng tôi, có hàng chục nghìn người và mỗi trung bình có 5-10 tài khoản.
Tôi cần truy xuất tài khoản của từng người, giả sử họ thực hiện các yêu cầu nhất định. Sau đó, tôi cần phải xem liệu tất cả các tài khoản của người này, cùng nhau, có hoàn thành một điều kiện khác không.
Trong ví dụ này, chúng ta hãy nói rằng tôi cần mỗi tài khoản với
amount < 100
, và rằng sau khi lấy tài khoản của một người, tôi cần phải kiểm tra xem số tiền của họ lớn hơn 1000.Sử dụng một truy vấn LINQ là mong muốn, nhưng không thể thực hiện bằng cách sử dụng các từ khóa
group-by-into
, bởi vì Nhà cung cấp LINQ (LINQ-to-CRM) không hỗ trợ nó.Bên cạnh đó, thực hiện các truy vấn LINQ đơn giản sau đây để thực hiện niêm yết 3 yêu cầu này cũng là không thể (vui lòng đọc comment inlined):
var query = from p in personList join a in accountList on p.Id equals a.PersonId where a.Amount < 100 select a; var groups = query.GroupBy(a => a.PersonId); // and now, run in bulks on x groups // (let x be the groups amount that won't cause an out-of-memory exception)
Nó không phải là có thể cho 2 lý do:
a. Nhà cung cấp LINQ buộc phải gọi tới
ToList()
trước khi sử dụngGroupBy()
.b. Cố gắng thực sự gọi
ToList()
trước khi sử dụngGroupBy()
dẫn đến một ngoại lệ ngoài bộ nhớ - vì có hàng chục nghìn tài khoản.Vì lý do hiệu quả, tôi không muốn làm những điều sau đây, vì nó có nghĩa là hàng chục ngàn khả năng tìm lại:
a. Truy xuất tất cả mọi người.
b. Lặp lại chúng và truy xuất tài khoản của mỗi người trên mỗi lần lặp.
Sẽ rất vui vì những ý tưởng hiệu quả.
Cũng như một FYI: điểm 4 và 5.A là như nhau, và 5.B là loại ngụ ý. Bạn có lẽ cũng sẽ nhận được một OOM với một GroupBy anyway –