【问题标题】:Entity Framework: Get Model with Linked Models in Many to Many Relationship实体框架:获取具有多对多关系中链接模型的模型
【发布时间】:2012-04-04 13:29:11
【问题描述】:

我来自 TSQL + C# 领域,一直在努力适应 linq 和 EF。多对多的关系一直困扰着我。我有想要从数据库中查询的具有多对多关系的模型。如:

     class Product{
       public int ID {get;set;}
       public string ProductName {get;set;}
       public virtual ICollection<Tag> Tags {get;set;}
     }

   class Tag {
       public int ID {get;set;}
       public string TagName {get;set;}
       public virtual ICollection<Product> Products {get;set;}

    }

我能够从 DbContext 中获取产品本身,然后再获取它的相关标签,如下所示:

// product exists in memory as a Product with an empty product.Tags

var query = from p in db.Product
            from t in db.Tags
            where p.ID == product.ID
            select p.Tags;

然后我可以为 product.Tags 分配获取的标签。显然,如果我必须查询每个产品,这在处理多个产品时效率非常低。

使用 linq 和 EF,我希望能够在一次到数据库的往返行程中获得具有所有相关标签的产品。此外,我希望能够获取所有产品及其相关标签(或过滤的产品列表)。 linq 的外观如何?

编辑:

好的,经过一番折腾,我得到了这个:

var query = db.Product.Include("Tags")
            .Where(p => p.Tags.Any(t => t.Products.Select(m => m.ID).Contains(p.ID)));

这几乎是我需要的。结果都是带有标签的产品。缺少的是没有标签的产品。我认为这相当于 SQL 内连接。我想将标签从外部连接到产品,并返回所有带有可选标签的产品。如何在不排除没有标签的产品的情况下获取所有带有关联标签的产品?

编辑:

这比我想象的要容易。

var query2 = db.Product.Include("Tags").DefaultIfEmpty();

这将获取所有产品及其各自的标签,包括没有标签的产品。希望它有正确的理由...

【问题讨论】:

    标签: linq entity-framework many-to-many


    【解决方案1】:

    使用像 EF 这样的对象关系映射器的目的是它为您映射关系。如果您手动连接数据库中具有外键的对象,那么您做错了。

    查看我的问题Why use LINQ Join on a simple one-many relationship?

    正确答案是context.Products.Include("Tags"),它会自动为您加入产品和标签。这实际上是使用 ORM 的最大(唯一?)好处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多