LINQ -> Where

Posted by muchag | C# |
初回投稿:2018-02-08 (木) 10:54:02 | 最終更新:2018-02-11 (日) 12:16:10

【環境】
Visual C#: 15.5.4(2017)
OR

if 文と同じように書けば良い。


.Where(x => x == 1 || x => x == 2)
動的に生成

C#erの備忘録:Linqの動的条件生成ライブラリ(2013-02-16)
→ありがたくライブラリを使わせていただいたけど、期待通りには動かなかった。


var condition = ConditionChain.Create(condition1).OrElse(condition2);

ここで、null になっちゃったんだったっけか。。。

Posted by muchag | C# |
初回投稿:2018-02-08 (木) 10:54:02 | 最終更新:2018-02-11 (日) 12:16:10

Database operation expected to affect 1 row(s) but actually affected 0 row(s).

Posted by muchag | C# |
初回投稿:2018-02-06 (火) 0:12:26 | 最終更新:2018-02-06 (火) 0:17:58

【環境】
Visual C#: 15.5.4(2017)
経緯

SQLite3 で管理しているデータを削除しようとしたら
下記エラーが出た。

{“Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=527962 for information on understanding and handling optimistic concurrency exceptions.”} Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException

データが既に更新またや削除されているよ。。。って、誰よ~TT

原因

データベースに格納されている日付文字列が「2018-02-05」となっていたため
DateTime 型で値を持っている C# では「2018-02-05 00:00:00」となり
整合性が取れなくなっていたみたい。

解決

データベース側の値を「2018-02-05 00:00:00」とすることで
エラーは出なくなった。

愚痴

そもそも SQLite のデータ型に DateTime がないから・・・。
ん~なんで、初期データを「2018-02-05」しちゃったんだろう。。。
私がアホなだけよね。。。

Posted by muchag | C# |
初回投稿:2018-02-06 (火) 0:12:26 | 最終更新:2018-02-06 (火) 0:17:58

ハッシュ値

Posted by muchag | C# |
初回投稿:2018-01-28 (日) 22:27:38 | 最終更新:2018-01-28 (日) 22:32:33

暗号化って、全然勉強できてないな~。
今回はまずは序章ということで、参考サイトのまんま実装してみる。
何かの記事に書いてあったけど、もう MD5 はやばいそうな。

「せめて 256 バイト以上のものを利用しましょう」とあったので
試してみた。

【環境】
Visual C#: 15.5.4(2017)
SHA256

行け!偏差値40プログラマー:[ C# ] SHA256 で文字列のハッシュ値を計算・取得する


// 文字列のハッシュ値(SHA256)を計算・取得する
protected string _GetHashedTextString(string passwd)
{
    // パスワードをUTF-8エンコードでバイト配列として取り出す
    byte[] byteValues = Encoding.UTF8.GetBytes(passwd);
 
    // SHA256のハッシュ値を計算する
    SHA256 crypto256 = new SHA256CryptoServiceProvider();
    byte[] hash256Value = crypto256.ComputeHash(byteValues);
         
    // SHA256の計算結果をUTF8で文字列として取り出す
    StringBuilder hashedText = new StringBuilder();
    for (int i = 0; i < hash256Value.Length; i++)
    {
        // 16進の数値を文字列として取り出す
        hashedText.AppendFormat("{0:X2}", hash256Value[i]);
    }
    return hashedText.ToString().ToLower();
}

ほぼ、上記サイトからいただいてきたんだけど
18行目だけ。

そもそものハッシュ値を、
Good-Tool.net:ハッシュ値の一括計算・生成ツール(無料)
で生成したため、ToLower だけ追加した。

Posted by muchag | C# |
初回投稿:2018-01-28 (日) 22:27:38 | 最終更新:2018-01-28 (日) 22:32:33

「OK」「キャンセル」

Posted by muchag | C#,Visual Studio |
初回投稿:2018-01-28 (日) 20:28:51 | 最終更新:2018-01-28 (日) 22:40:07

フォームの「OK」「キャンセル」ボタンのお話。

【環境】
Visual C#: 15.5.4(2017)
キー連動

フォーム表に配置したボタンに「OK」「キャンセル」の挙動を持たせる。
=Enter 押下で反応する「OK」ボタン、ECS 押下で反応する「キャンセル」ボタン。

フォームのプロパティ
AcceptButton:「OK」の挙動をするボタンの Name を設定
CancelButton:「キャンセル」の挙動をするボタンの Name を設定

手書き

下記のように手書きして、Form の Key_Down イベントへ登録する手もある。


private void Login_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
    }
    else if (e.KeyCode == Keys.Cancel)
    {
    }
}
値の受け渡し

値の受け渡し

Posted by muchag | C#,Visual Studio |
初回投稿:2018-01-28 (日) 20:28:51 | 最終更新:2018-01-28 (日) 22:40:07

アプリケーション設定

Posted by muchag | C#,Visual Studio |
初回投稿:2018-01-28 (日) 18:47:49 | 最終更新:2018-01-28 (日) 23:22:14

アプリケーション内の設定のこと。
preference の方が区別が付くかも?

この話、どこかの記事に書いた気がするんだけど
見つけられないので、改めて記述。

【環境】
Visual C#: 15.5.4(2017)
入れ物

プロジェクトのコンテキストメニュー [プロパティ] 左ペイン [設定]

こちらの画面で、1つずつ下記を設定していく。
名前:設定値の名称。任意。プログラム内で使用するので、アルファベットで設定してね
種類:設定値のデータ型
スコープ:
アプリケーション:全ユーザー統一
ユーザー:ユーザー毎
値:値

利用

// 取得
txtUsername.Text = Properties.Settings.Default.LoginUsername;
Properties.Settings.Default.Save();

// 設定
Properties.Settings.Default.LoginUsername = "username";
保存場所

ユーザー設定は、ユーザーの非表示のローカル アプリケーション データ フォルダーのサブフォルダー内のファイルに保存されます。

MSDN:方法 : 実行時にユーザー設定を C# で書き込む

というわけで、SQLite -> 導入 にも書いた通り

C:\Users\[user_name]\AppData\Local\Packages\(おそらくランダム文字列)\LocalState

にあるみたいだけど、上記記事は UWP の場合なわけで
フォームアプリケーションの場合は、パッケージ ID をどこで見ればいいのかしらね~。

Posted by muchag | C#,Visual Studio |
初回投稿:2018-01-28 (日) 18:47:49 | 最終更新:2018-01-28 (日) 23:22:14

Form -> 継承

Posted by muchag | C# |
初回投稿:2018-01-23 (火) 23:16:41 | 最終更新:2019-09-23 (月) 16:40:37

【環境】
Visual C#: 16.2.5(2019C)
基本

フォームの継承は、めんどいルールがあった気がする。
勉強したときに、メモし忘れたらしい。

とりあえず、久しぶりにフォームを継承してみて
ルールを忘れていたせいで、エライことになった。
強制終了 -> フォームの継承

継承ルールを再度勉強しないと。。。

Posted by muchag | C# |
初回投稿:2018-01-23 (火) 23:16:41 | 最終更新:2019-09-23 (月) 16:40:37

LINQ

Posted by muchag | C# |
初回投稿:2018-01-23 (火) 22:10:21 | 最終更新:2018-01-25 (木) 22:59:33

Language INtegrated Query(統合言語クエリー)。

【環境】
Visual C#: 15.5.4(2017)
前提

本日勉強を始めたばかりなので、
これから!

とにかく、SQL 専用なわけではない。

LINQ プロバイダー

LINQは、アクセスするデータの種類に応じてLINQ to Objects、LINQ to SQL、LINQ to XML、LINQ to DataSetなどに分類できます

これらはLINQプロバイダーと呼ばれます。
プロバイダーはアクセスするデータソースに応じて動的に切り替わりますので、
アプリケーション開発者がプロバイダーを意識する必要はほとんどありません。

BuildINSIDER:LINQとは?[C#](2014-11-11)

おー よかった。
いっぱい出てきてわけがわからなくなってきていた。

構文

クエリー式とメソッド式がある。

参考サイト

Qiita:LINQチートシート的なもの(2017-12-08)
→ありがたや~。ちゃんと読みましょう!

netplanetes log:BindingSource.DataSource に LINQ to Entity の ObjectQuery を指定してはいけない(2009-10-10)
→まだ意味がよくわからないけど、試行錯誤の途中で、この問題に直面したような気がする。。。
MSDN:コントロールへのオブジェクトのバインド (Entity Framework)

Posted by muchag | C# |
初回投稿:2018-01-23 (火) 22:10:21 | 最終更新:2018-01-25 (木) 22:59:33

LINQ -> Where 条件分岐

Posted by muchag | C# |
初回投稿:2018-01-23 (火) 20:43:44 | 最終更新:2018-01-25 (木) 22:57:02

【環境】
Visual C#: 15.5.4(2017)
経緯

EntityFramwork の実践 をする中で
Where 部の条件分岐をする必要が出た。

その際、参考サイトの手法のまま、メソッド式 LING を利用しており
条件分岐の方法が分からなくて、あれこれ探し回った。

元々

参考サイトの記述は下記の通り。
この記事用に不要部を削除して進行。


var user02 = db.Users.Where((u) => u.Name == "User02").Include("KptBoards").First();

var user02 = db.Users.Where((u) => u.Name == "User02").First();
要件

現状は User02 を取得することになっているけど
条件によって、User02, User03 を分けたい。

前提

実際の稼働確認は、他のコードで行ったので
この記事内のコードの稼働確認は行っていない。

三項演算子

三項演算子による条件分岐は
式形式では成功。
ステートメント形式では失敗。

式形式

成功。 😎


bool flg = true;
var user02 = db.Users.Where((u) => (flg) ? u.Name == "User02" : u.Name == "User03").First();
ステートメント形式

失敗。 😥


bool flg = true;
var user02 = db.Users.Where((u) => { (flg) ? u.Name == "User02" : u.Name == "User03"; }).First();
CS0834 ステートメント本体を含むラムダ式は、式ツリーに変換できません
参考サイト

プログラミング C# – 翔ソフトウェア (Sho’s):[C#][ラムダ式][式木] Expression として扱えるラムダ式と扱えないラムダ式

メソッド
条件分岐なし

まずはメソッドを利用する方法を体験するために
条件分岐なしパターン。


var user02 = db.Users.Where(IsTarget).First();

private bool IsTarget(User u)
{
	return u.Name == "User02";
}

こういう書き方で、引数 u は自動でメソッドへ送られる。

条件分岐あり。そのまんま

上記のまま、条件を足してみた。


bool flg = true;
var user02 = db.Users.Where(IsTarget(flg)).First();

private bool IsTarget(User u, bool flg)
{
	if (flg) return u.Name == "User03";
	
	return u.Name == "User02";
}
CS7036 ‘Main.GetEmployeesWhereLambda(Employee, bool)’ の必要な仮パラメーター ‘boolIncludingQuitted’ に対応する特定の引数がありません。

こういう書き方はできないらしい。

ラムダ式

下記のように記述したら上手くいった。


bool flg = true;
var user02 = db.Users.Where((u) => IsTarget(u, flg)).First();

private bool IsTarget(User u, bool flg)
{
	if (flg) return u.Name == "User03";
	
	return u.Name == "User02";
}

デリゲートも含めて、理屈を理解できていないので
まだまだ挙動を掴めない。

しばらくは勉強ですね。。。

Posted by muchag | C# |
初回投稿:2018-01-23 (火) 20:43:44 | 最終更新:2018-01-25 (木) 22:57:02

ラムダ式

Posted by muchag | C# |
初回投稿:2018-01-23 (火) 18:33:11 | 最終更新:2018-01-25 (木) 22:56:51

話には聞いていた「ラムダ式」。
無名関数のことだったのね~。

MSDN?:ラムダ式 (C# プログラミング ガイド)
Wikipedia:C#の無名関数

【環境】
Visual C#: 15.5.4(2017)
序章

といいつつ、無名関数のことも、まだ良く理解できていない。。。
いつもの如く、習うより慣れろ!で頑張るぞ~!

概念
一言で言うと

ラムダ式とはメソッド定義を式として扱える機能のこと

Qiita:関数型プログラミングって何、ラムダってなんだよ ラムダ式(2016-10-23)

本日、初対面の「ラムダ式」の情報に目を通してきたけど
この一言で、それなりにまとまった気がする。
ありがとうございます。

ザックリ

私なりに解釈すると、今まで1つ1つメソッドを実装してきたけど
ラムダ式なら、わざわざメソッドとして切り出さなくても、式の中に入れ込めるよ!
ってことかしらね~。

三項演算子

直感では「三項演算子」とイメージが似ていると思う。


// if で真面目に書く
if (a) { return b; }
else { return c; }

// 三項演算子を用いる
(a) ? b : c;

// 真面目にメソッドを実装する
string result = GetResult(value);

private string GetResult(string value)
{
	return "result : " + value;
}

// ラムダ式で書く
string result = (value) => "result : " + value;
書式

// 式形式
(引数) => 処理

// ステートメント形式
(引数) => {処理}

// 非同期ラムダ
MSDN?:ラムダ式 (C# プログラミング ガイド) 参照

// 標準クエリ演算子でのラムダ
MSDN?:ラムダ式 (C# プログラミング ガイド) 参照

ルール
式形式

右辺は、式ツリーとなるらしい。


(value) => "result : " + value

右辺の行末 ;(セミコロン)は不要
もちろん、行全体の行末 ;(セミコロン)は必要

ステートメント形式

右辺は、デリゲートとなるらしい。


(value) => { return "result : " + value; }
引数が1つのときは () を省略できる

value => "result : " + value
引数がないときは、() だけ記述する

() => "result : OK"

このときの () は省略できない

引数を複数設定できる

(a, b) => "result : " + a + ", " + b
引数の型を指定できる

ラムダ式では、型推論によって、型を解決できるので
型の指定は不要だけど、指定することも可能。


(string value) => "result : " + value
  • ラムダにはデリゲート型と同じ数のパラメーターが含まれていなければなりません。
  • ラムダに含まれる各入力パラメーターは、対応するデリゲート パラメーターに暗黙的に変換できなければなりません。
  • ラムダの戻り値 (ある場合) は、デリゲートの戻り値の型に暗黙的に変換できなければなりません。

MSDN?:ラムダ式 (C# プログラミング ガイド)

=>

=> を「ラムダ演算子」という。

変数スコープ
  • ラムダ外の変数を参照できる
  • ラムダ内の変数を外部から参照することはできない

ザックリ理解するとこんな感じ?
正確な情報は下記の通り。

  • 取り込まれた変数は、その変数を参照するデリゲートがガベージ コレクションの対象になるまでガベージ コレクトされません。
  • ラムダ式内に導入された変数は、外側のメソッドでは参照できません。
  • ラムダ式は、外側のメソッドの ref パラメーターまたは out パラメーターを直接取り込むことはできません。
  • ラムダ式に含まれる return ステートメントで外側のメソッドを戻すことはありません。
  • ラムダ式には、 goto ステートメント、 break ステートメント、およびジャンプ ステートメントのジャンプ先がブロック外である場合はラムダ式の内部にある continue ステートメントを含めることはできません。 また、ジャンプ先がブロックの内部にある場合は、ラムダ式の外部でジャンプ ステートメントを使用するとエラーになります。

MSDN?:ラムダ式 (C# プログラミング ガイド)

参考サイト

Qiita:はじめての LINQ(2018-01-16)
→LINQ 全体だけど、ひとまずこちらへ。勉強!

Qiita:関数型プログラミングって何、ラムダってなんだよ ラムダ式とスコープ(2016-10-23)

Qiita:C# 今更ですが、ラムダ式(2017-10-27)
→何度も読み返して勉強しましょう!

Qiita:【LINQの前に】ラムダ式?デリゲート?Func?な人へのまとめ【知ってほしい】(2015-02-17)
→何度も読み返して勉強しましょう!

Qiita:C#のExpressionで動的コード生成(2017-12-19)
→式形式(式木、式ツリー)の勉強に!

Qiita:LINQとラムダ式ってなにができるの?(2015-10-04)
→こちらのおかげで、メソッドへ引数を渡す方法に気がついた

@IT:C#ラムダ式 基礎文法最速マスター(2010-03-09)
→ここも分かりやすかった

iPentec:デリゲートとラムダ式の書き換え =>演算子の利用 (C#プログラミング)
→デリゲートと比較しながら勉強するのによさそう

Posted by muchag | C# |
初回投稿:2018-01-23 (火) 18:33:11 | 最終更新:2018-01-25 (木) 22:56:51

DataGridView

Posted by muchag | C#,Visual Studio |
初回投稿:2018-01-23 (火) 14:26:29 | 最終更新:2018-01-23 (火) 17:17:13

データを一覧表示するコントロール。

MSDN:DataGridView コントロール (Windows フォーム)
MSDN:DataGridView クラス

【環境】
Visual C#: 15.5.4(2017)
用途

データを一覧表示するコントロール。

プロパティ

MSDN:DataGridView クラス
一覧はこちらにあるので、逆引きで!

縞々にしたい

MSDN:AlternatingRowsDefaultCellStyle

行ヘッダを消したい

RowHeadersVisible

Posted by muchag | C#,Visual Studio |
初回投稿:2018-01-23 (火) 14:26:29 | 最終更新:2018-01-23 (火) 17:17:13
« 前ページへ次ページへ »