2012-01-26 6 views
0

関心のあるIDのリストがあれば、DBから削除された行を特定する方法が必要です。 のような何か:LINQからSQLへの既存の行のチェック

var idsOfInterest = new int[] {1,2,3,4}; 
idsOfInterest.Except(Datacontext.Table.Select(tbl=>tbl.ID)).Dump(); 

私はそれをどのように行うことができますか?最適なLINQクエリは何ですか?

EDIT:既存のIDを照会せずにExcept?を適用すると、1つのステップ(単一のDBクエリ)で実行できますか?

+1

ご質問はありますか? –

+0

@RoyDictus質問を追加しました。ありがとうございます! – jaraics

答えて

2

あなた自身のコードはうまくいくでしょう。ただし、データベースからすべてのIDを取得するため、パフォーマンス上の問題が発生する可能性があるため、以下の方が効率的です。

var idsInDatabase = 
    from t in DataContext.Table 
    where idsOfInterest.Contains(t.ID) 
    select t.ID; 

var idsDeletes = idsOfInterest.Except(idsInDatabase); 

UPDATE:私は理解して、あなたの更新から

、あなたが存在しないIDを希望するので、行うのは非常に困難であるデータベースから、不足しているすべてのIDを取得したいと思いますもはやデータベースから。

普通のSQLでこれを実行しようとすると、参加する数字の大きなリスト{0,1,2,3、...}を含むテーブルが必要になります(TableはすべてのIDをもう含まない)、または内部クエリまたはテーブル値関数を作成します。これは次のようになります。

SELECT x.id 
FROM (
      SELECT 1 as id 
      UNION ALL 
      SELECT 2 
      UNION ALL 
      SELECT 3 
      UNION ALL 
      SELECT 3) x 
     LEFT OUTER JOIN Table t ON x.id = t.ID 
WHERE t.ID IS NULL 

私が知る限り、このような構成をLINQ to SQLに変換する方法はありません。テーブル値関数についても同じことが言えます。

TableにはNumbersというテーブルを参加させることができますが、私は個人的にそれをしません。

+0

これは可能な解決策ですが、1つのステップで実行できますか?質問の編集を参照してください。 – jaraics

+0

@ jaraics - 1つのステップで重要なのはなぜですか? –

+0

@Ramhound興味のあるIDだけを返すクエリがあれば、リストにあるIDを取得するより効率的です。 ...それが可能ならば...それは今の質問 – jaraics

0

どのようにこれをやっている?

 var idsOfInterest = new int[] {1,2,3,4 }; 

     var table = new int[] {2,3}; 


     var deletedIDs = from id in idsOfInterest 
         join t in table 
         on id equals t into gj 
         where !gj.Contains(id) 
         select id;