2011-08-09 4 views
0

Q:第1のデータテーブルに存在するものを取得する方法と、第3のデータテーブルに第2のデータテーブルに存在しないものを取得する方法はありますか?

私は2つのクエリをそれぞれ1つ返します。DataTableです。私は別のDaTaTableの結果として()、第2のDataTableの第1のDataTableと存在しない(NOT IN)に存在するもの)を返したいと思う。

マイクエリ:

編集:私はそれが一般的な作り:

1-DT1:

DataTable dt1 = cc1assiscrsevalDAL.GetAll(int.Parse(Session["course_prof"].ToString()), 0); 

2-DT2:

DataTable dt2 = cc1assiscrsevalDAL.GetConfirmedEval(int.Parse(Session["course_prof"].ToString())); 

注: batch_no、crsnum、lect_codeはcomです


posite主キーにそれを行うための最善の方法は何ですか?(賢明なパフォーマンス)。 私はLINQでそれをしたいと考えています(可能な場合)。

+1

いつでもNOT EXISTSを使用すると、NOT EXISTSが完全なテーブルスキャンを実行するため、テーブルのサイズに応じてパフォーマンスヒットのために自分自身を設定します。 – Tim

+0

'Informix'データベース。 –

+0

編集済み................... –

答えて

2
var dt = dt1.AsEnumerable().Except(dt2.AsEnumerable(), new CustomDataRowEqualityComparer()).CopyToDataTable(); 

    public class CustomDataRowEqualityComparer: IEqualityComparer<DataRow> 
     { 

      public bool Equals(DataRow x, DataRow y) 
      { 
       return ((int)x["crsnum"]) == ((int)y["crsnum"]) 
        && ((int)x["crsnum_e"]) == ((int)y["crsnum_e"]) 
         && ((int)x["crstteng"]) == ((int)y["crstteng"]); 
      } 

      public int GetHashCode(DataRow obj) 
      { 
       return ((int)obj["crsnum"])^((int)obj["crsnum_e"])^((int)obj["crstteng"]) ; 
      } 
     } 

あなたの問題を解決しますが、我々は、私は上記のコードで行われているもののために別のクラスを作成する必要がある場合を除き呼ばLINQでの拡張メソッドがあります。

var x = From a In dt1 
    Select (...relevant columns) 

var y = From a In dt2 
    Select (...relevant columns) 

そして実行します。

+0

これは、両方のクエリにあるすべてのレコードになりますが、just_nameは2番目のクエリにあるレコードを含める必要はありません。 – J0HN

+0

訂正ありがとう –

1
select * 
from (*target_query*) t 
join 
(
    select batch_no,crsnum,lect_code from (*target_query*) q 
    except 
    select batch_no,crsnum,lect_code from cc1assiscrseval 
) temp on temp.batch_no = t.batch_no and temp.lect_code = t.lect_code, temp.crsnum = t.crsnum 

かなり汚いソリューション、私はあなたが二回最初のクエリを実行することなく、唯一の希望batch_no、crsnumとlect_codeを取得することにより、それを簡素化することができると思います。しかし、あなた自身でそれを理解する必要があります。

+0

申し訳ありません編集.... –

+1

さらに構造が異なります。どのキーを含める/除外しますか?私はあなたのDB構造を認識していません:) – J0HN

+0

別の編集... –

0

LINQのは、あなたがこの

var _differences = dt1.AsEnumerable.Except(dt2.AsEnumerable()); // No checked or tested in VS 

ような何かを行うことができますので、あなたはまた、最初にこのようなものを使用して、関連する列を得ることができる場合を除き方法を提供します上記以外。

HTH!

関連する問題