Tôi đang chiếu kết quả LINQ to SQL vào các lớp được đánh máy mạnh: Cha mẹ và Con. Sự khác biệt về hiệu năng giữa hai truy vấn này là lớn:truy vấn LINQ dự kiến từ một đến nhiều được thực hiện liên tục
Query chậm - đăng nhập từ DataContext cho thấy một cuộc gọi riêng biệt để các db đang được thực hiện cho mỗi phụ huynh
var q = from p in parenttable
select new Parent()
{
id = p.id,
Children = (from c in childtable
where c.parentid = p.id
select c).ToList()
}
return q.ToList() //SLOW
Query nhanh - đăng nhập từ các chương trình DataContext một db truy vấn hit duy nhất trả về dữ liệu tất cả các yêu cầu
var q = from p in parenttable
select new Parent()
{
id = p.id,
Children = from c in childtable
where c.parentid = p.id
select c
}
return q.ToList() //FAST
tôi muốn buộc LINQ để sử dụng phong cách đơn truy vấn của ví dụ thứ hai, nhưng cư các lớp chuyên với trẻ em của họ đối tượng trực tiếp. nếu không, tài sản Trẻ em là IQuerierable<Child>
phải được truy vấn để hiển thị đối tượng Trẻ em.
Các câu hỏi được tham chiếu dường như không giải quyết được tình huống của tôi. sử dụng db.LoadOptions không hoạt động. có lẽ nó yêu cầu loại là TEntity được đăng ký với DataContext.
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Parent>(p => p.Children);
db.LoadOptions = options;
Xin lưu ý: Cha mẹ và con là loại đơn giản, không phải là Table<TEntity>
loại. và không có mối quan hệ theo ngữ cảnh giữa Phụ Huynh và Trẻ Em. các truy vấn con là ad-hoc.
Điểm mấu chốt của sự cố: trong ví dụ LINQ thứ hai, tôi thực hiện các câu lệnh IQueriable
và không gọi hàm ToList()
và vì lý do nào đó LINQ biết cách tạo một truy vấn đơn có thể truy xuất tất cả dữ liệu được yêu cầu. Làm cách nào để điền vào phép chiếu ad-hoc của tôi với dữ liệu thực tế như được thực hiện trong truy vấn đầu tiên? Ngoài ra, nếu có ai có thể giúp tôi giải thích tốt hơn câu hỏi của tôi, tôi sẽ đánh giá cao nó.
Làm cách nào để 'Child' là một" loại đơn giản "? Nó phải là một loại ánh xạ. Và là 'parenttable' một' Bảng 'hoặc kết quả của một truy vấn LINQ trước đó? Một số câu lệnh linq có thể khiến L2S chuyển đổi từ việc tham gia thành N + 1. –
Điểm đánh dấu trùng lặp: bạn có biết sự khác biệt giữa khung thực thể và linq với sql không? –
@GertArnold Trong khi phần LINQ của EF/L2S thường làm cho các câu hỏi tương tự có chức năng trùng lặp, trong trường hợp * này * tôi tin rằng bạn hoàn toàn chính xác; chúng không phải là bản sao. Mở lại. –