Tôi đang viết một hệ thống ASP.net dựa trên thẻ. Sử dụng chương trình db sau:LINQ options.loadwith problem
Topic <many-many> TagTopicMap <many-many> Tag
Về cơ bản nó là một phương pháp 3NF (toxi) mà tôi tìm thấy từ sau: http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html
Dưới đây là đoạn mã tôi có:
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Topic>(t => t.TagTopicMaps);
options.LoadWith<TagTopicMap>(tt => tt.Tag);
var db = new lcDbDataContext();
db.LoadOptions = options;
db.Log = w;
var x = from topic in db.Topics
orderby topic.dateAdded descending
select topic;
ViewData["TopicList"] = x.Take(10);
Khi tôi thực hiện điều này, kết quả là tốt, nhưng nó đi kèm với 11 truy vấn SQL đơn, một để nhận danh sách 10 chủ đề hàng đầu:
SELECT TOP (10) [t0].[Id], [t0].[title], [t0].[dateAdded]
FROM [dbo].[Topics] AS [t0] ORDER BY [t0].[dateAdded] DESC
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1
Và 10 trong số những người khác để biết chi tiết về các thẻ riêng lẻ.
tôi đã cố gắng để chuyển đổi hai câu loadwith và tắt, và tìm thấy những điều sau đây xảy ra:
loadwith<topic> : no difference for on or off.
loadwith<tagtopicmap>: 11 Queries when on, much more when off.
Nói tóm lại, CHỈ tùy chọn loadwith thứ hai đang làm việc như mong đợi. Người đầu tiên không có hiệu lực!
Tôi cũng đã cố gắng tạo kết quả ToList(). Nhưng thậm chí còn nhiều vấn đề sắp xảy ra: đối với phần chi tiết thẻ, nó chỉ truy xuất các mục UNIQUE, tất cả các thẻ lặp lại đó (cùng một thẻ có thể xuất hiện trong một số chủ đề!) Bị truy vấn bỏ qua.
Một điều cuối cùng, đây là đoạn code tôi sử dụng trong aspx để lấy dữ liệu, trong trường hợp làm cho ToList kết quả(), tôi thay đổi (IQueryable) đến (IList):
<% foreach (var t in (IQueryable)ViewData["TopicList"])
{
var topic = (Topic)t;
%>
<li>
<%=topic.title %> ||
<% foreach (var tt in (topic.TagTopicMaps))
{ %>
<%=tt.Tag.Name%>,
<%} %>
</li>
<%
}
%>
Nó không phải luôn luôn là INNER JOIN. Nếu * tất cả các trường tham gia là null-khả năng * thì nó sẽ là một LEFT JOIN - nó là một "tính năng sai" không có giấy tờ mà INNER JOIN tạo ra ngay cả khi các trường nối * chứa một số (nhưng không phải tất cả) null-có thể cột*. –