2009-05-19 12 views
7

मैं एक टैग-आधारित एएसपीनेट सिस्टम लिख रहा हूं।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> 
    <% 
     } 
    %> 

उत्तर

5

कम जवाब है: LinqToSql में इस तरह के कई quirks है, और कभी-कभी आपको कार्य-आसपास का उपयोग करना पड़ता है ...

लिंक 2 एसक्यूएल लोडविथ विकल्प बस डेटाबेस टेबल के बीच एक आंतरिक जुड़ने का कारण बनता है, ताकि आप अपने लिंक को पुनः लिखकर समान व्यवहार को मजबूर कर सकें कुछ ऐसा बयान (कृपया किसी भी टाइपो को माफ कर दो, मुझे वीबी सिंटैक्स में लिंक लिखने के लिए उपयोग किया जाता है ...):

var x = from topic in db.Topics 
     join topicMap in topic.TagTopicMaps 
     orderby topic.dateAdded descending 
     group topicMap by topicMap.topic into tags = Group; 

इस वाक्य रचना बहुत गलत हो सकता है लेकिन मूल विचार (, आदि या "समूह में शामिल होने", "दो") है कि आप विषय और TagTopicMaps के बीच में शामिल होने का मूल्यांकन करने के लिए मजबूर Linq2Sql, और फिर समूहीकरण का उपयोग करें परिणाम सेट में वस्तु विरासत को संरक्षित करें।

+0

यह हमेशा एक इंटर्न जॉइन नहीं है। यदि * सभी शामिल फ़ील्ड शून्य-सक्षम हैं * तो यह एक बाएं जॉइन होगा - यह संदिग्ध रूप से एक अनियंत्रित "गलत-विशेषता" है कि INNER JOIN उत्पन्न होता है जब भी शामिल फ़ील्ड * में कुछ (लेकिन सभी नहीं) शून्य सक्षम कॉलम *। –

1

अपने डेटाकॉन्टेक्स्ट क्लास पर सक्षम करने के लिए सक्षम डिफर्ड लोड को सेट करें।

0

आपके मामले में समस्या ले लो (10) है। यहाँ घोड़े के मुंह से है:

https://connect.microsoft.com/VisualStudio/feedback/details/473333/linq-to-sql-loadoptions-ignored-when-using-take-in-the-query

सुझाव दिया समाधान का छोड़ें जोड़ना है (0)। यह मेरे लिए काम नहीं करता था, लेकिन छोड़ें (1) काम किया। बेकार हो सकता है, कम से कम मुझे पता है कि मेरी समस्या कहां है।