C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.87816 の関連記事表示

<< 0 >>
■87816  DataTableとの差分比較をしたい
□投稿者/ MTK -(2018/07/02(Mon) 15:44:18)

    分類:[C#] 

    Visual Studio 2015
    .NET Framework 4.5.2


    お世話になります。

    データベースにINT型でC_Yearというカラムがあります。
    C#のプログラム上で下記のSQLを発行し、C_Yearの一覧を取得し、DataTable型の retTable という変数に格納しています。

    select C_Year
    from tbCorpYear;



    ここからが本題なのですが、この取得したC_Yearの一覧と、プログラム上で宣言している

    List<string> payrollYear

    との差分を出したいです。


    例えば
    C_Yearの一覧    → 2015,2016,2018
    payrollYearの一覧 → 2016,2017
    の場合だと

    2018 のみを取得(C_Yearにあって、payrollYearにないものだけ)したいです。


    試してみたことはLINQを使って

    var items = retTable.AsEnumerable()
          .Except(payrollYear);

    のようにしてみたのですが、『IQueryable<string>型のレシーバが必要です』 のようなエラーが出てきてしまい、行き詰まっております。
    このエラーの意味や、比較する方法について教えていただけないでしょうか。
親記事 /過去ログ151より / 関連記事表示
削除チェック/

■87817  Re[1]: DataTableとの差分比較をしたい
□投稿者/ 魔界の仮面弁士 -(2018/07/02(Mon) 16:06:58)
    No87816 (MTK さん) に返信
    > データベースにINT型でC_Yearというカラムがあります。

    それを受け取る DataTable 側の C_Year フィールドの型は
    int ですか? decimal ですか? string ですか?


    > List<string> payrollYear
    こちらは string なのですね。
    比較の際には、DataTable と List の双方の型を合わせる必要があるでしょう。


    > C_Yearの一覧    → 2015,2016,2018
    > payrollYearの一覧 → 2016,2017
    > の場合だと
    > 2018 のみを取得(C_Yearにあって、payrollYearにないものだけ)したいです。

    2015 が除去される理由は何でしょうか?


    var retTable = new DataTable("retTable");
    retTable.Columns.Add("C_Year", typeof(int));
    retTable.Rows.Add(2015);
    retTable.Rows.Add(2016);
    retTable.Rows.Add(2018);

    var payrollYear = new List<string>() { "2016", "2017" };

    var cYears = retTable.AsEnumerable().Select(r => r["C_Year"].ToString());

    string[] except = cYears.Except(payrollYear).ToArray();
記事No.87816 のレス /過去ログ151より / 関連記事表示
削除チェック/

■87819  Re[2]: DataTableとの差分比較をしたい
□投稿者/ MTK -(2018/07/02(Mon) 16:38:17)
    2018/07/02(Mon) 16:40:00 編集(投稿者)

    No87817 (魔界の仮面弁士 さん) に返信

    ご回答ありがとうございます。


    > それを受け取る DataTable 側の C_Year フィールドの型は
    > int ですか? decimal ですか? string ですか?

    int型でした。
    その辺りも意識しないといけませんね。


    >>List<string> payrollYear
    > こちらは string なのですね。
    > 比較の際には、DataTable と List の双方の型を合わせる必要があるでしょう。

    はい、stringで管理しています。
    今回、恐らく型が合っていないためにこのようなエラーが出ているということですね。


    > 2015 が除去される理由は何でしょうか?

    すいません、2015も抽出されるのが正しいです。


    > var retTable = new DataTable("retTable");
    > retTable.Columns.Add("C_Year", typeof(int));
    > retTable.Rows.Add(2015);
    > retTable.Rows.Add(2016);
    > retTable.Rows.Add(2018);
    >
    > var payrollYear = new List<string>() { "2016", "2017" };
    >
    > var cYears = retTable.AsEnumerable().Select(r => r["C_Year"].ToString());
    >
    > string[] except = cYears.Except(payrollYear).ToArray();

    ありがとうございます!
    無事に比較することができました。

    .Select(r => r["C_Year"].ToString())
    のようにすれば C_Year のカラムをStringの一覧にできるのですね。
    ありがとうございました。
記事No.87816 のレス / END /過去ログ151より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -