Linq to entities de nombreux de nombreux de sélection: Comment faire pour forcer la génération d'une JOINTURE à la place d'une clause de sous-sélection?

Linq to entities de nombreux de nombreux de sélection: Comment faire pour forcer la génération d'une JOINTURE à la place d'une clause de sous-sélection?

À l'aide de EF DB d'abord j'ai deux entités (Fournisseur, Produit) qui ont un plusieurs-à-plusieurs relations. Entity Framework ne permet pas de créer une entité pour la table associée (SupplierProduct) que les associés de la table contient uniquement la clé primaire de la forte entités.

J'ai eu tous les Fournisseurs qui ne fournissent pas un produit donné avec la requête suivante:

var q1 = context.Suppliers.Where(s=>!s.Products.Any(p=>p.Id == 1));

SQL produit utilise un EXISTE dépendant de la sous-requête similaire à ceci:

SELECT *
FROM Suppliers s
WHERE NOT EXISTS
  (SELECT 1 
   FROM SupplierProduct sp WHERE sp.SupplierId = s.Id && sp.ProductId = 1)

Est-il possible, à l'aide de Linq to entities méthode de la syntaxe, de produire une requête qui utilise des jointures sur la table associée à la place?

ie:

SELECT DISTINCT s.*
FROM SupplierProduct sp
JOIN Supplier s ON s.Id = sp.SupplierId;
WHERE sp.ProductId != 1

Mise à jour

Comme l'a souligné JoeEnos mes questions ci-dessus ne font pas la même chose. La n'EXISTE PAS de sous-requête est probablement la meilleure façon d'aller ici. Que faire si j'essayais d'obtenir tous les fournisseurs qui ne d'approvisionnement d'un produit? Je voudrais changer ma requête linq to entities légèrement à:

var q1 = context.Suppliers.Where(s => s.Products.Any(p=>p.Id == 1));

Et le SQL généré serait:

SELECT *
FROM Suppliers s
WHERE EXISTS
  (SELECT 1 
   FROM SupplierProduct sp WHERE sp.SupplierId = s.Id && sp.ProductId = 1)

Ce qui est bien, j'obtiens le résultat que je souhaite. Cependant, si j'écrivais SQL dans ce cas je le ferais normalement:

SELECT s.*
FROM SupplierProduct sp
JOIN Supplier s ON s.Id = sp.SupplierId;
WHERE sp.ProductId = 1

Ma requête linq to entities être modifié pour produire le SQL ci-dessus?

Quel est votre objectif? Cette requête ne pas fournir les résultats que vous recherchez?
En outre, cet exemple serait beaucoup plus facile à lire avec une meilleure vie réelle de l'échantillon, comme les Voitures<-->Pilotes ou quelque chose comme ça.
très bien, mis à jour avec un exemple réel. Ma requête existante est exactement ce que je veux, cependant, si j'ai été à l'aide de SQL je ne voudrais pas écrire une requête comme ça, je voudrais utiliser une jointure à la place. Je me demande comment je peux le faire avec Linq to entities.
Merci, beaucoup plus facile à lire.
user1914530 j'ai changé la question titre un peu plus précise sur ce que vous semblez vouloir, une jointure au lieu d'une sous-sélection.

OriginalL'auteur | 2013-02-26