2010-11-22 51 views
2

我需要創建一個基於子查詢返回結果的LINQ查詢。我不太確定我的措辭是否正確,但我知道要提出的最好方法就是舉個例子。我怎樣才能把下面的TSQL查詢到LINQ查詢(表是相同的名稱,對象):LINQ查詢類似於SQL WHERE x IN

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

正如您可以猜到,我試圖讓「可用」美食列表可上市用戶添加到餐廳提供的美食列表中。在LINQ我迄今返回所有的美食,並在帳戶已經被加入到其他表中現有CuisineId的用不了:

我到處都找過一個例子,但不太清楚如何來形容正是我需要的。我看着爲LINQ查詢參考MSDN,但我需要什麼找不到像什麼:

MSDN LINQ Sample Queries

任何人能夠給我一個例子嗎?

+0

我注意到你鏈接到VB.NET LINQ樣品。如果是的話指定。 – 2010-11-22 20:50:23

+0

如果這是Linq to SQL,請確保您沒有按照'where not in(1,2,3,4,5,6,7)`中的行來結束TSQL。它發生太容易了。 :) – bzlm 2010-11-22 20:56:08

回答

3

在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 
    }; 

在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

我修改了你的查詢,這正是我需要到VB中,並得到以下,它返回我需要的確切結果。謝謝多豪伊!
昏暗availableCuisines =從c在db.Cuisines哪裏都不(從RC在db.RestaurantCuisines其中rc.RestaurantId = ID選擇rc.CuisineId)。載有(c.CuisineId) 選擇C – Keith 2010-11-22 21:04:47

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

嘗試:

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

有沒有嘗試,只做。 – bzlm 2010-11-22 20:55:07

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