سؤال

وأنا أكتب نظام ASP.net القائم على العلامة. باستخدام نظام ديسيبل التالية:

وTopic <many-many> TagTopicMap <many-many> Tag

والاساس هو نهج 3NF (TOXI) التي وجدت من بين الخيارات التالية: <لأ href = "http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html" يختلط = "نوفولو noreferrer"> 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 الاستفسارات SQL واحدة، واحدة للحصول على قائمة أهم 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 resultset و(). ولكن المزيد من مشكلة الخروج: بالنسبة للجزء علامات التفاصيل، فإنه استرداد فقط تلك العناصر الفريدة، كل تلك تكرار العلامات (! قد تظهر هذه العلامة نفسها في عدد من الموضوع، طبعا) تم إسقاطها من قبل الاستعلام

واحد آخر شيء بعد هو رمز كنت في ASPX لاسترداد البيانات في حالة جعل tolist نتيجة ()، وتغيير (IQueryable) إلى (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>
    <%
        }
    %>
هل كانت مفيدة؟

المحلول

والجواب القصير هو: LinqToSql لديها العديد من المراوغات من هذا القبيل، وأحيانا تضطر إلى استخدام العمل في أنحاء ...

والخيار مصمم الرسم Linq2SQL LoadWith يؤدي ببساطة صلة داخلية بين جداول قاعدة البيانات، لذلك يمكنك فرض سلوك مماثل من قبل rewritting بيان ينق لشيء من هذا القبيل (يرجى أن يغفر أي الأخطاء المطبعية، أنا معتاد على ريتينغ ينق في جملة VB ... ):

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

قد يكون بناء الجملة هذا خاطئ، ولكن الفكرة الأساسية هي أنك إجبار مصمم الرسم Linq2SQL لتقييم الصلة بين المواضيع وTagTopicMaps، ومن ثم استخدام تجميع (أو "مجموعة انضمام"، "ترك"، وما إلى ذلك) للحفاظ على وجوه التسلسل الهرمي في مجموعة النتائج.

نصائح أخرى

وتعيين EnabledDefferedLoad على الطبقة datacontext بك إلى false.

والمشكلة في حالتك هو أن تأخذ (10). وهنا من فم الحصان:

<وأ href = "https://connect.microsoft.com/VisualStudio/feedback/details/473333/linq-to-sql-loadoptions-ignored-when-using-take-in-the-query" يختلط = "نوفولو"> https://connect.microsoft.com/VisualStudio/feedback/details/473333/linq-to-sql-loadoptions-ignored-when-using-take-in-the-query

والحل المقترح هو إضافة تخطي (0). لم يفلح ذلك بالنسبة لي، ولكن التخطي (1) فعل العمل. غير مجدية لأنها قد تكون، على الأقل أنا أعرف أين مشكلتي هي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top