【问题标题】:LINQ Query Similar to SQL WHERE x INLINQ 查询类似于 SQL WHERE x IN
【发布时间】:2010-11-23 05:24:00
【问题描述】:

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

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

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

我已经查看了一个示例,但不太确定如何准确描述我需要的内容。我查看了 LINQ 查询的 MSDN 参考,但找不到任何我需要的东西:

MSDN LINQ Sample Queries

谁能举个例子?

【问题讨论】:

  • 我注意到您链接到了 VB.NET LINQ 示例。如果是,请指定。
  • 如果这是 Linq to SQL,请确保您不会按照 where not in (1,2,3,4,5,6,7) 的行结束 TSQL。它发生得太容易了。 :)

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


【解决方案1】:

在 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

【讨论】:

  • 我修改了您的查询,这正是我在 VB 中所需要的,得到了​​以下结果,它返回了我需要的确切结果。非常感谢豪伊!!!
    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】:
var cuisines = db.Cuisine.Where(c => !RestaurantCuisine.Any(
                rc => rc.RestaurantId == c.Id && rc.CuisineId == c.CuisineId);

【讨论】:

  • 有没有机会知道这在 VB 中会是什么样子?另外,rc来自哪里?我尽我所能将其转换为 VB 并想出了以下但无济于事: Dim Cuisines = From c In db.Cuisines.Where(c >= Not RestaurantCuisine.Any(rc >= rc.RestaurantId = c.Id & rc.CuisineId = c.CuisineId))
  • 点菜 = db.Cuisine.Where(Function(c) (!RestaurantCuisine.Any(Function(rc) (rc.RestaurantId = c.Id Or rc.CuisineId = c.CuisineId))) )
  • 关闭,但尝试: Dim Cuisines = db.Cuisine.Where(Function(c) Not RestaurantCuisine.Any(Function(rc) (rc.RestaurantId = c.Id AndAlso rc.CuisineId = c.美食ID)))
  • rc 是 RestaurantCuisine 的缩写。它代表单行。对 LINQ 查询的参数名称使用首字母缩写是一种常见的做法。
【解决方案3】:

试试:

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

【讨论】:

    【解决方案4】:
    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
                                    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      相关资源
      最近更新 更多