0

3列のテーブルがあります。


名前 varchar

Test1 ビット

Test2 ビット

グループ varchar


目的:

グループごとの名前ごとにtest1のみがtrueであるすべての行を選択したいと思います。


明確にするために、これらのサンプルレコードを取り上げます。

Name | Test1 | Test2 | Group
Foo    True    False   Group 1
Bar    True    False   Group 1
Bar    False   True    Group 2
Foo    False   True    Group 1
123    True    False   Group 1

2番目の行が選択されます。これは、同じ「名前」の値を持つ同じグループのTest2に対してtrueがテストされたことがないためです。

表のある時点で、同じグループ名のTest2に対してtrueとテストされているため、最初の行は選択されません。

Test2で真のテストが行​​われたことがないため、最後の行が選択されます。

注:明示的に検索するグループ名があります。

私が試したこと

私が試した(そしてそれが機能する)のは、テスト1が真であるすべての行を選択することです。次に、各IDに対して別の検索を実行し(この最初のクエリの結果を繰り返し処理)、再度表示されるかどうかをテストしました。ここで行ったことは回避策ですが、Linqには「存在しない」機能がたくさんあることを理解しており、それらを利用して、これまでに書いたものの状態を改善したいと思っています。 1つのステートメントにまとめます。

コード例

var items = itemsTable.Where(o => o.Group.Equals(GroupName) && o.Test1);
4

2 に答える 2

1
var items = itemsTable.Where(o => !o.Test2 && 
    !itemsTable.Any(x => x.Name == o.Name && x.Group == o.Group && x.Test2));
于 2013-01-04T17:45:15.383 に答える
1

以下を使用できます。

var items = itemsTable.GroupBy(e => new { e.Name, e.Group }, e => e)
     .Where(g => !g.Any(e => e.Test2) &&  g.Key.Group.Equals(groupName))
     .SelectMany(e => e).ToList();
于 2013-01-04T17:48:55.647 に答える