2

私はこのようなテーブルを持っています:

| FruitID | BasketID | FruitType |

クエリにリストを渡しているのですが、 AND内にあり、特定BasketIDsのリストのみが必要です(値は1または2のみです)。FruitIDsBasketIDFruitType

これは私が持っているものです:

var TheQuery = (from a in MyDC.MyTable

                where TheBasketIDs.Contains(a.BasketID) &&
                      a.FruitType == 1 // need help here

                select a.FruitID).ToList();

where2番目の条件を表現するのに少し苦労しています。すべてが1で、どれも2ではないFruitIDs場所が必要です。FruitType

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

たとえば、Fruit 23はFruitType常に1であるため問題ありませんが、Fruit 19は2もあるため問題ありません。これは、渡すFruitTypeリストに5が含まれていない場合でも同様です。TheBasketIDs

4

2 に答える 2

8

これを行う 1 つの方法は、フルーツ 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);
于 2013-02-04T14:23:56.577 に答える
1
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();
于 2013-02-04T14:24:42.593 に答える