LINQ查询类似于SQL WHERE x IN

时间:2010-11-22 20:35:09

标签: linq tsql asp.net-mvc-2 entity-framework-4

我需要创建一个基于子查询返回结果的LINQ查询。我不太确定我的措辞是否合适,但我知道要问的最佳方式就是展示一个例子。如何将以下TSQL查询转换为LINQ查询(表与对象同名):

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

您可以猜到,我正在尝试列出一系列“可用”美食,供用户添加到餐厅提供的美食列表中。到目前为止,LINQ我还没有考虑到已经添加到另一个表中的现有CuisineId:

我一直在寻找一个例子,但不太确定如何准确描述我需要的东西。我查看了LINQ查询的MSDN参考,但找不到我需要的东西:

MSDN LINQ Sample Queries

任何人都可以举个例子吗?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

尝试:

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

答案 3 :(得分: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
                                });