代码之家  ›  专栏  ›  技术社区  ›  clockwiseq

类似于SQL的LINQ查询,其中x在

  •  2
  • clockwiseq  · 技术社区  · 15 年前

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

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

    你可以猜到,我正在尝试获取一个“可用”菜系列表,供用户添加到餐厅提供的菜系列表中。到目前为止,LINQ已经返回了所有菜肴,并且没有考虑到已经添加到另一张表中的现有菜肴:

    我到处找了一个例子,但不太清楚如何准确地描述我需要的东西。我查看了LINQ查询的MSDN参考资料,但找不到我需要的东西:

    MSDN LINQ Sample Queries

    有谁能给我举个例子吗?

    4 回复  |  直到 15 年前
        1
  •  3
  •   cdhowie    15 年前

    在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
    
        2
  •  2
  •   Anthony Faull    15 年前
    var cuisines = db.Cuisine.Where(c => !RestaurantCuisine.Any(
                    rc => rc.RestaurantId == c.Id && rc.CuisineId == c.CuisineId);
    
        3
  •  1
  •   Claus Asbjørn Sørensen    15 年前

    尝试:

    Cuisine.Where(c => !RestaurantCuisine.Select(rc => rc.CuisineID).Contains(c.CuisineID)).Select(c => c);
    
        4
  •  0
  •   Femaref    15 年前
    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
                                    });