代码之家  ›  专栏  ›  技术社区  ›  xandy

linq options.loadWith问题

  •  7
  • xandy  · 技术社区  · 16 年前

    我正在编写一个基于标记的ASP.NET系统。使用以下数据库方案:

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

    基本上,这是一种3nF方法(toxi),我从以下方面发现: 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个用于单独获取标签细节。

    我试着打开和关闭两个loadwwith语句,发现发生了以下情况:

    loadwith<topic> : no difference for on or off.
    loadwith<tagtopicmap>: 11 Queries when on, much more when off.
    

    简而言之,只有第二个loadWith选项按预期工作。第一个没有任何效果!

    我还尝试将结果集设置为List()。但接下来会出现更多的问题:对于标签细节部分,它只检索那些唯一的项目,所有重复的标签(当然,相同的标签可能会出现在许多主题中!)被查询删除。

    最后一件事是,下面是我在ASPX中用于检索数据的代码,在使结果ToList()的情况下,我将(iQuery)更改为(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>
        <%
            }
        %>
    
    3 回复  |  直到 13 年前
        1
  •  5
  •   Mark    16 年前

    简短的答案是:linqtosql有几个这样的怪癖,有时你不得不使用变通方法…

    linq2sql loadwwith选项只会导致数据库表之间的内部联接,因此您可以通过将linq语句重写为类似的内容来强制执行类似的行为(请原谅任何拼写错误,我习惯于用vb语法编写linq…):

    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之间的连接,然后使用分组(或“group join”、“let”等)来保留结果集中的对象继承关系。

        2
  •  1
  •   vik sehdave    15 年前

    将DataContext类上的EnabledDefferedLoad设置为false。

        3
  •  0
  •   DenNukem    13 年前

    你的问题是取(10)。这是从马嘴里说的:

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

    建议的解决方法是添加skip(0)。这对我不起作用,但斯基普(1)起作用了。尽管可能没用,但至少我知道我的问题在哪里。