LINQ options.loadwith 问题

2024-05-17

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

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

基本上,这是我从以下内容中发现的 3NF 方法(toxi):http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html 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()。但更多的问题出现了:对于标签详细信息部分,它只检索那些唯一的项目,所有这些重复标签(当然,相同的标签可能出现在多个主题中!)都会被查询删除。

最后一件事,以下是我在 aspx 中用于检索数据的代码,如果将结果转为 list(),我将 (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 选项只会导致数据库表之间进行内部联接,因此您可以通过将 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 和 TagTopicMap 之间的连接,然后使用分组(或“group join”、“let”等)来保留对象层次结构结果集。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LINQ options.loadwith 问题 的相关文章

  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但
  • 我需要改变什么才能正确实施 SOLID 设计?

    我正在尝试学习 SOLID 设计 但我认为我犯了一个错误 我认为IItem界面不遵循里氏替换原则在我的内Player但是 我不知道如何解决这个问题 如果我从 IItem 添加新的界面绘图 我将必须更改 Player 的方法以添加一个案例来处
  • 将 C# 中的 asmx web 服务的 Soap 请求标头从 text/xml 更改为soap/xml

    我需要调用网络服务 我生成了一个代理并调用了该方法 但它一直失败 因为 API 期望标头中包含soap xml 而 Visual Studio 中生成的代理客户端则在标头中发送文本 xml 问题 是否可以更改生成的代理客户端的 Conten
  • WebApi 添加另一个 Get 方法

    我有一个非常标准的 WebApi 可以执行一些基本的 CRUD 操作 我正在尝试添加一些不同类型的查找 但不太确定它应该如何完成 这是我目前的FoldersController public class FoldersController
  • malloc :匿名映射和魔法区域

    我只是在摆弄内存映射 想查看用户空间虚拟内存区域映射 写了一些像这样的行 char ptr NULL printf Allocating 300KB n ptr malloc 300 1024 printf Allocated at p s
  • 在 SpecFlow 测试中使用 ChromeDriver

    因此 正如我们所知 当您使用 SpecFlow 时 如果您重复使用另一个测试中的步骤 它会自动将其拉入并重复使用 但是 我遇到了一个问题 测试 A 登录我 测试 B 登录并确认主页是正确 但当我开始使用测试 B 时 测试 A 正在初始化 C
  • 在 C# 应用程序中使用 LinkedIn API

    我正在构建一个小型 Windows 窗体应用程序 并且想要从公司搜索 API 访问信息 我什至不想在个人资料中写入任何内容 我已经打开一个网络浏览器并要求我的用户在我的应用程序中输入一些验证码 这真是令人难以置信的令人沮丧 有大量针对 Py
  • 需要在c#中的字符串中的“单词”之后获取一个字符串

    我在 C 中有一个字符串 我必须在字符串中找到特定的单词 code 并且必须获取单词 code 之后的剩余字符串 该字符串是 错误描述 code 1 所以我必须找到这个词code在上面的字符串中 我必须获取错误代码 我见过正则表达式 但现在
  • “反序列化操作回复消息正文时出错...” - 对于我调用的每个方法

    我正在尝试为我们的波兰拍卖服务 Allegro 创建非常简单的客户端应用程序 他们提供 SOAP 架构中的 API 问题是 每次我尝试调用任何方法时 我都会收到 反序列化操作 方法名称 的回复消息正文时出错 一般来说 我对网络服务不熟悉 所
  • 使对象在运行时不可变 [C#]

    有什么方法 我希望利用反射 可以使实例化对象不可变及其所有公共财产 我有一个来自其他人的代码库 没有可用源 的类 我需要使用它 并且我基本上希望在实例化该类后 如果任何地方的任何代码段尝试调用该类中的公共设置器 则抛出异常 注意 我不想在类
  • C# 验证用户输入(如信用卡号)

    这是为了一个任务 我需要为三明治店创建一个程序 其中一部分是验证用户的付款信息 本次作业的指导方针是 信用卡号码必须为16位数字 前 4 位数字必须是以下数字之一 1298 1267 4512 4567 8901 8933 到期日期必须为
  • 我应该如何获取 IEnumerable 的长度? [复制]

    这个问题在这里已经有答案了 我正在编写一些代码 然后去获取 IEnumerable 的长度 当我写的时候myEnumerable Count 令我惊讶的是 它没有编译 看完之后IEnumerable Count 和 Length 之间的区别

随机推荐