8

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

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

基本上这是我从以下内容中发现的 3NF 方法(毒物):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()。但更多的问题出现了:对于标签详细信息部分,它只检索那些 UNIQUE 项目,所有那些重复的标签(当然,同一个标签可能出现在许多主题中!)被查询删除。

最后一件事,以下是我在 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>
    <%
        }
    %>
4

3 回答 3

5

简短的回答是:LinqToSql 有几个这样的怪癖,有时你必须使用变通方法......

Linq2Sql LoadWith 选项只会导致数据库表之间的内部连接,因此您可以通过将 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 评估 Topics 和 TagTopicMaps 之间的连接,然后使用分组(或“组连接”、“让”等)在结果集。

于 2009-05-23T20:17:19.497 回答
1

将 datacontext 类的 EnabledDefferedLoad 设置为 false。

于 2009-11-29T05:17:41.400 回答
0

您的问题是 Take(10)。这是马的口中:

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

建议的解决方法是添加 Skip(0)。这对我不起作用,但 Skip(1) 确实有效。尽管它可能没用,但至少我知道我的问题出在哪里。

于 2012-02-06T17:01:45.073 回答