linq查询选择某个值的所有元素,但不选择另一个值的元素

本文关键字:元素 选择 查询 另一个 linq | 更新日期: 2023-09-27 17:57:37

我有一个看起来有点像这样的表:

| FruitID | BasketID | FruitType |

我在查询中传递一个BasketIDs的列表,并且我想要BasketID and中的FruitIDs的列表,这些列表仅属于特定的FruitType(值只能是1或2)。

这就是我所拥有的:

var TheQuery = (from a in MyDC.MyTable
                where TheBasketIDs.Contains(a.BasketID) &&
                      a.FruitType == 1 // need help here
                select a.FruitID).ToList();

我在表达第二个where条件时遇到了一些困难。我想要FruitIDs,其中所有的FruitType都是1,没有一个是2。

| FruitID | BasketID | FruitType |
|   23    |    2     |    1      |
|   23    |    5     |    1      |  
|   19    |    2     |    1      |
|   19    |    5     |    2      |

例如,Fruit 23是可以的,因为它的FruitType总是1,但Fruit 19不可以,因为它也有一个2的FruitType,即使我传入的TheBasketIDs列表不包含5。

linq查询选择某个值的所有元素,但不选择另一个值的元素

一种方法是按水果id分组,然后用LINQ表达式检查结果组:

var ids = MyDC.MyTable
    .GroupBy(r => r.FruitID)
    // The following condition examines g, the group of rows with identical FruitID:
    .Where(g => g.Any(item => TheBasketIDs.Contains(item.BasketID))
             && g.Any(item => item.FruitType == 1)
             && g.All(item => item.FruitType != 2))
    .Select(g => g.Key);

这将生成所需类型的FruitID的列表。

编辑:(回应下面的评论)

类型仅为1或2,但从不为3

然后您可以简化您的查询如下:

var ids = MyDC.MyTable
    .GroupBy(r => r.FruitID)
    // The following condition examines g, the group of rows with identical FruitID:
    .Where(g => g.Any(item => TheBasketIDs.Contains(item.BasketID))
              // When there is no 3-rd state, FruitType==1 will keep FruitType==2 out
             && g.All(item => item.FruitType == 1))
    .Select(g => g.Key);
var TheQuery = (from a in MyDC.MyTable
                group a by a.FruitID into g
                where g.Any(b => TheBasketIDs.Contains(b.BasketID)) && g.All(b => b.FruitType == 1)
                select g.Key).ToList();