gpt4 book ai didi

c# - LINQ options.loadwith问题

转载 作者:太空狗 更新时间:2023-10-29 20:26:09 24 4
gpt4 key购买 nike

我正在编写一个基于标记的 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 个用于单独获取标签的详细信息。

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

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

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

我还尝试制作结果集 ToList()。但更多的问题出现了:对于标签详细信息部分,它只检索那些 UNIQUE 项目,所有那些重复的标签(当然,相同的标签可能出现在多个主题中!)都被查询删除。

最后一件事,以下是我在 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 和 TagTopicMaps 之间的连接,然后使用分组(或“group join”、“let”等)来保留对象结果集中的层次结构。

关于c# - LINQ options.loadwith问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/880734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com