2010-11-22 93 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);