2009-03-11 14 views
0

私は、監査テーブルを操作できるcorerct LINQ to SQLクエリ演算子と述語コンボを見つけようとしています。ログテーブルのLINQクエリ演算子

rowID、DefID、Valueという3つの列を持つSettingというテーブルを想像してみてください。

すべてのDefID(この場合はすべての定義1〜3)に値がtrueに設定された少なくとも1つの行があることを確認できます。

LINQ式は、真または偽のboolを返す必要があります。 DEFID 3はALL定義ので、真

RowID DefID Value 
1  1  true 
2  1  false 
3  2  true 
4  3  true 

リターンが欠落しているので、DEFID = 2は、任意の値=真

RowID DefID Value 
1  1  true 
2  2  false 
3  2  true 

falseを返していないので、例えば、

RowID DefID Value 
1  1  true 
2  2  false 
3  3  true 

LINQはfalseを返します少なくとも1つの値= trueを持つ

+0

少し具体的にする必要があります。たとえば、2番目の例でDefID = 3で停止することをどのように知っていますか? 3番目の例でDefID = 4が "missing"していませんか? –

+0

私は正確に3つの定義があることを知っています。 1、2、3です。私は探している定義IDの完全なセットを持っています。 [1,2,3]のような任意の配列を使用できます。 –

+0

上記の出力を生成するためのlinqクエリをすでに持っていて、true/falseを返すために追加するものを探していますか?それとも、すべてを求めているのですか? – Logicalmind

答えて

1

は、拡張メソッドを使った例です:

int[] ids = new int[] { 1, 2, 3 }; 

bool allFound = Settings.Where(s => s.Value && ids.Contains(s.DefID)) 
         .Select(s => s.DefID) 
         .Distinct() 
         .Count() == ids.Length; 
0

私はlinqをSQLに使用したことはありませんが、linq tオブジェクトは次のようになります。

defIds.All(d => d.rows.Any(row => row.Value == true)) 

生のSQLで行うには、1つのクエリでは可能ではないと思います。あなたはこのようなことをすることができます:

select id from DefIds 
join rows on row.DefId = DefIds.ID 
where row.Value = true 

それは本当の値を持つdefIdのリストを与えるでしょう。コードでは、次に何かをすることができます

DefIds.Select(d => d.id).ToArray() == (results from select).ToArray() 
0

まあ、これを行うには有効な方法がたくさんあります。一つの簡単な方法は、次のとおりです。

int[] DefIDs = new int[] {1, 2, 3}; 

bool bHasValidDefs = 
    (
    from set in myDataBase.settings 
    where 
     set.Value == true 
     && DefIDs.Contains(set.DefID) 
    select set.DefID 
    ).Distinct().Count() == DefIDs.Count(); 

これはあなたの有効なリストにあるそれらもまた、少なくとも1つの「値== true」の行を持っているユニークなDefIDsの数を取得します。次に、これらの有効なDefIDの数が上記で定義した期待値と等しいことを確認します。ここで

0

あなたがValidSettingsまたはSettingsMasterテーブルを有するOKであれば、あなたは可能性:

bool allFound = myContext.SettingsMaster.All(m=> m.Settings.Any(s=>s.Value)); 

現在のテーブルのバージョンについては、私は

int[] allIds = new int[] {1, 2, 3}; 
var validIds = (
    from s in myContext.Settings 
    where s.Value 
    select s.DefId 
    ) 
    .Distinct().ToList(); 
bool allFound = allIds.All(id => validIds.Contains(id));