2010-07-21 10 views
0

J'essaie d'utiliser LINQ pour interroger le modèle de données d'entité suivante alt text
basé sur ce modèle db alt textrequêtes LINQ avec de nombreux à plusieurs tables dans Entity Data Model

Je voudrais être capable de tirer une liste de produits basés sur ProductFacets.FacetTypeId.

Normalement, j'utiliserais des jointures et ce ne serait pas un problème mais je ne comprends pas comment interroger des tables many-to-many sous Entity DataModel.

Ceci est une requête SQL exemple:

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

Répondre

1

EF 4 Présumant:

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

Dans EF (en supposant que la cartographie est fait correctement), les jointures sont presque jamais utilisées; les propriétés de navigation sont utilisées à la place.

Votre SQL d'origine retourne un tuple avec des entrées Nom répétées. Avec LINQ, il est souvent plus facile de "former" les requêtes en résultats non-tuple.

Ce qui suit doit être le même que le SQL, seulement au lieu de retourner (Nom, FacetTypeId) paires avec les noms répétés, il retournera un type qui a un nom et une séquence de 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, 
      };