2010-11-22 7 views
2

J'ai besoin de créer une requête LINQ qui renvoie des résultats basés sur une sous-requête. Je ne suis pas sûr de bien le formuler, mais la meilleure façon de demander est de montrer un exemple. Comment puis-je tourner la requête TSQL suivante dans une requête LINQ (tables sont même nom que les objets):Requête LINQ similaire à SQL WHERE x IN

SELECT CuisineId, Name 
FROM Cuisine 
WHERE CuisineId NOT IN (SELECT CuisineId 
         FROM RestaurantCuisine 
         WHERE RestaurantId = @id) 

Comme vous pouvez le deviner, je suis en train d'obtenir une liste des cuisines « disponibles » listé pour un utilisateur à ajouter à une liste de cuisines qu'un restaurant offre. Le LINQ J'ai jusqu'ici retourné TOUTES les cuisines et ne tient pas compte des CuisineId existants qui ont déjà été ajoutés à l'autre table:

J'ai regardé partout pour un exemple mais je ne sais pas trop comment décrire exactement ce dont j'ai besoin. Je regardais la référence MSDN pour les requêtes LINQ mais ne pouvait pas trouver quelque chose comme ce que je dois:

MSDN LINQ Sample Queries

Toute personne capable de me donner un exemple?

+0

Je vous remarqué lié au LINQ VB.NET Échantillons Précisez si c'est le cas. –

+0

S'il s'agit de Linq to SQL, assurez-vous que TSQL ne se termine pas comme suit: 'where not in (1,2,3,4,5,6,7)'. Cela arrive trop facilement. :) – bzlm

Répondre

3

En C#:

var query = 
    from c in db.Cuisine 

    where !(from rc in db.RestaurantCuisine 
      where rc.RestaurantId == id 
      select rc.CuisineId) 
      .Contains(c.CuisineId) 

    select new { 
     c.CuisineId, 
     c.Name 
    }; 

En VB.NET:

Dim availableCuisines = _ 
    From c In db.Cuisines _ 
    Where Not (From rc In db.RestaurantCuisines _ 
       Where rc.RestaurantId = id _ 
       Select rc.CuisineId) _ 
       .Contains(c.CuisineId) _ 
    Select c 
+0

J'ai modifié votre requête qui est exactement ce dont j'avais besoin dans VB et j'ai obtenu ce qui suit et elle renvoie le résultat exact dont j'avais besoin. Merci beaucoup Howie !!!
Dim availableCuisines = A partir de Dans db.Cuisines Où Non (De rc Dans db.RestaurantCuisines Où rc.RestaurantId = id Sélectionnez rc.CuisineId) .Contains (c.CuisineId) Sélectionnez c – Keith

+0

Pas de problème! Je vais ajouter le code VB à ma réponse aussi. – cdhowie

0
var query = (from c in Cuisine 
       where !(from rest in RestaurantCuisine 
           where (rest.RestaurantID == id)).Contains(c.CuisineId) 
         select new 
           { 
            CuisineID = c.CuisineID, 
            Name = c.Name 
           }); 
1

Essayez:

Cuisine.Where(c => !RestaurantCuisine.Select(rc => rc.CuisineID).Contains(c.CuisineID)).Select(c => c); 
+1

Il n'y a pas d'essai, seulement faire. – bzlm

2
var cuisines = db.Cuisine.Where(c => !RestaurantCuisine.Any(
       rc => rc.RestaurantId == c.Id && rc.CuisineId == c.CuisineId); 
+0

Une chance de savoir à quoi cela ressemblerait dans VB? aussi, d'où vient le rc? J'ai essayé de mon mieux pour convertir cela en VB et est venu avec le suivant, mais en vain: Dim cuisines = De c En db.Cuisines.Où (c> = Non RestaurantCuisine.Any (rc> = rc.RestaurantId = c.Id & rc.CuisineId = c.CuisineId)) – Keith

+1

Dim cuisines = db.Cuisine.Where (Fonction (c) (! RestaurantCuisine.Any (Fonction (rc) (rc.RestaurantId = c.Id Ou rc.CuisineId = c.CuisineId)))) –

+2

Fermez, mais essayez: Dim cuisines = db.Cuisine.Where (Fonction (c) Non RestaurantCuisine.Any (Fonction (rc) (rc.RestaurantId = c.Id EtAlso rc.CuisineId = c .CuisineId))) – diceguyd30