1

我来自 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();

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

4

1 回答 1

0

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

请参阅我的问题为什么在简单的一对多关系上使用 LINQ Join?

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

于 2012-04-04T05:29:11.353 回答