使用Entity Framework和LINQ以及Foreach循环复制输出

fhity93d  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(153)

概述

我有一个网站,我写的是个人书签。它们是分类保存的。我可以打印出链接很好,当我这样做的时候。但是当我在混合中抛出一个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

如果有人能解释为什么会发生这种情况,我将非常感谢。谢谢

wvt8vs2t

wvt8vs2t1#

操作:
这条路上的每一个链接都有副本。我不明白为什么会发生这种情况。
发生这种情况是因为您没有使用join,如果您不使用,它会将A中的项目乘以B中的项目数。类似的问题和解决方案可以在here中找到。

导航属性

这假定您已经在数据库模式中正确定义了关系和外键,并且在EF代码/EDMX中有相应的信息。
考虑到您正在使用ORM,一种不会导致重复的更简单的方法是利用EF导航属性。
更改以下内容:

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
    }
}

...到:

var categoryContext = new LinkDatabaseEntities();
var linkContext = new LinkDatabaseEntities();
foreach (var category in categoryContext.Categories)
{
    foreach (var link in category.Links) // <---- notice the use of the nav property
    {
        // the above category.Links contains only the links applicable
        // for a given category AND NOT all the links found in say a LINKS table

        (Print Out HTML Code)
    }
}

以上是通过利用EF已经知道哪些Link属于给定的Category来工作的,因为导航属性反映了在数据库模式中定义的关系和外键。

另请参阅

相关问题