LINQ查询实体数据模型中的多对多表

时间:2010-07-21 13:17:13

标签: linq ado.net-entity-data-model

我正在尝试使用LINQ来查询以下实体数据模型 alt text
基于此db模型 alt text

我希望能够根据ProductFacets.FacetTypeId提取产品列表。

通常,我会使用连接,这不会是一个问题,但我不太明白如何在Entity DataModel下查询多对多表。

这是一个示例sql查询:

select p.Name, pf.FacetTypeId from Products p
inner join ProductFacets pf on p.ProductId = pf.ProductId   
where pf.FacetTypeId in(8, 12)

2 个答案:

答案 0 :(得分:1)

假设EF 4:

var facetIds = new [] { 8, 12 };
var q = from p in Context.Products
        where p.FacetTypes.Any(f => facetIds.Contains(f.FacetTypeId))
        select p;

答案 1 :(得分:1)

在EF中(假设映射正确完成),几乎没有使用过连接;而是使用导航属性。

您的原始SQL返回带有重复Name条目的元组。使用LINQ,它通常更容易 将查询“塑造”为非元组结果。

以下内容应与SQL相同,而不是返回具有重复名称的(Name,FacetTypeId)对,它将返回一个具有Name和一系列FacetTypeIds的类型:

var facetIds = new [] { 8, 12 };
var result = from p in db.Products
             select new
             {
                p.Name,
                FacetTypeIds = from pf in p.FacetTypes
                               where pf.FacetTypeId == 8 || pf.FacetTypeId == 12
                               select pf.FacetTypeId,
             };