मैं एक टैग-आधारित एएसपीनेट सिस्टम लिख रहा हूं।LINQ options.loadwith समस्या
Topic <many-many> TagTopicMap <many-many> Tag
मूल रूप से यह एक 3NF दृष्टिकोण (toxi) है कि मैं निम्नलिखित से पाया: निम्नलिखित db योजना का उपयोग कर http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html
यहाँ कोड का टुकड़ा है मेरे पास है:
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);
जब मैं इसे निष्पादित करता हूं, तो परिणाम ठीक है, लेकिन यह 11 एकल एसक्यूएल प्रश्नों के साथ आता है, एक शीर्ष 10 विषयों की सूची प्राप्त करने के लिए:
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
और उनमें से 10 अन्य व्यक्तिगत रूप से टैग का विवरण प्राप्त करने के लिए।
मैं चालू और बंद दो loadwith बयान स्विच करने की कोशिश की, और पाया निम्नलिखित बातें होती हैं:
loadwith<topic> : no difference for on or off.
loadwith<tagtopicmap>: 11 Queries when on, much more when off.
संक्षेप में, केवल दूसरे loadwith विकल्प अपेक्षित रूप से कार्य कर रहा है। पहले का कोई प्रभाव नहीं पड़ता है!
मैंने परिणामस्वरूप ToList() को भी बनाने की कोशिश की। लेकिन यहां तक कि और भी समस्या आ रही है: टैग विवरण भाग के लिए, यह केवल उन अद्वितीय वस्तुओं को पुनर्प्राप्त करता है, वे सभी दोहराने वाले टैग (वही टैग कई विषयों में दिखाई दे सकते हैं!) क्वेरी द्वारा छोड़े जाते हैं।
एक आखिरी बात, निम्नलिखित कोड मैं, डेटा पुनः प्राप्त करने परिणाम tolist(), मैं करने के लिए (IList) बदल (IQueryable) बनाने के मामले में aspx में प्रयोग किया जाता है:
<% foreach (var t in (IQueryable)ViewData["TopicList"])
{
var topic = (Topic)t;
%>
<li>
<%=topic.title %> ||
<% foreach (var tt in (topic.TagTopicMaps))
{ %>
<%=tt.Tag.Name%>,
<%} %>
</li>
<%
}
%>
यह हमेशा एक इंटर्न जॉइन नहीं है। यदि * सभी शामिल फ़ील्ड शून्य-सक्षम हैं * तो यह एक बाएं जॉइन होगा - यह संदिग्ध रूप से एक अनियंत्रित "गलत-विशेषता" है कि INNER JOIN उत्पन्न होता है जब भी शामिल फ़ील्ड * में कुछ (लेकिन सभी नहीं) शून्य सक्षम कॉलम *। –