我正在编写一个基于标签的 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>
<%
}
%>