概述
我有一个网站,我写的是个人书签。它们是分类保存的。我可以打印出链接很好,当我这样做的时候。但是当我在混合中抛出一个linq查询,不知何故,我得到了每个链接的副本。
方案
第一个没有重复项的路径
现在我从循环中删除了html代码,因为它不重要。
var categoryContext = new LinkDatabaseEntities();
var linkContext = new LinkDatabaseEntities();
foreach (Category category in categoryContext.Categories)
{
foreach (Link link in linkContext.Links)
{
if (link.CatID.Equals(category.ID))
{
Print Out HTML Code
}
}
}
这个代码运行得很好。我没有收到任何重复的代码。
输出:
- 第1类
- 链接1
- 链接2
- 第二类
- 链接1
- 链接2
输出重复项的代码
现在,数据库中的信息不会很大,所以我真的不需要这样做来提高效率,我只想了解发生了什么。
var categoryContext = new LinkDatabaseEntities();
var linkContext = new LinkDatabaseEntities();
foreach (Category category in categoryContext.Categories)
{
var links = from link in linkContext.Links
where link.catID == category.ID
select link;
foreach (Link link in links)
{
Print Out HTML Code
}
}
这条路上的每一个链接都有副本。我不明白为什么会发生这种情况。
输出:
- 第1类
- 链接1
- 链接1
- 链接2
- 链接2
- 第二类
- 链接1
- 链接1
- 链接2
- 链接2
如果有人能解释为什么会发生这种情况,我将非常感谢。谢谢
1条答案
按热度按时间wvt8vs2t1#
操作:
这条路上的每一个链接都有副本。我不明白为什么会发生这种情况。
发生这种情况是因为您没有使用
join
,如果您不使用,它会将A中的项目乘以B中的项目数。类似的问题和解决方案可以在here中找到。导航属性
这假定您已经在数据库模式中正确定义了关系和外键,并且在EF代码/EDMX中有相应的信息。
考虑到您正在使用ORM,一种不会导致重复的更简单的方法是利用EF导航属性。
更改以下内容:
...到:
以上是通过利用EF已经知道哪些
Link
属于给定的Category
来工作的,因为导航属性反映了在数据库模式中定义的关系和外键。另请参阅