「C#」カテゴリーアーカイブ

【C#】ASP.netのTips

コードを書いてて、たまに「あれ?どうやるんだっけ」となるコードの備忘録です。

ListからIN句で使えるSQLを生成する

IN文句に対してプレースホルダが使えるようなORMを使っている場合はいいのですが、たいていの場合、うまく動いたためしがないので、文字列結合してくっつけます。Linqのメソッド構文でサクッと書けます。

// IN句で使えるようにシングルクォーテーション+カンマつなぎにする
var condition = string.Join(",", piyoIdList.Select(x => string.Format("'{0}'", x)));

// SQLを実行(テンプレートリテラルで条件値を設定)
var sql = $"SELECT * FROM T_HOGE WHERE piyoId IN ({condition});";

ただし、仕様上、IN句内のデータが大量になることが想定される場合はパフォーマンスの観点からお勧めできません。使用するDBによってはIN句内の設定値件数オーバーでエラーとなります。そのような場合は、素直にtempテーブルを作ってINNER JOINするか、Listを分割して複数回クエリを発行し、後でフェッチした値をAddRangeするなどの方法が考えられますが、前者の方がパフォーマンスが良いと思われます。

【C#】Asp.net MVCのハマりポイント

Asp.net でRazorを使っているといつもハマってしまうトラップポイントがありますので忘れないようにまとめておきます。

EditorForヘルパーについて

EditorForヘルパーは、HTML属性が反映されない。例えば以下のように書いても非活性になりません。その場合はためらわずTextBoxForなどの個別のヘルパーを使用します。placeholderや、Readonlyも同様です。

@Html.EditorFor(model => model.StoreName, new { @disabled = "disabled" })

以下のように書きます。

@Html.TextBoxFor(model => model.StoreName, new { @disabled = "disabled" })

DropDownListがselectedにならない

DropDownListForは、Modelとバインドした場合、第2引数のSelectListItemの値とModelの値が合致した場合、selectedに自動でしてくれる仕様があるのですが、ならない場合があります。
詳しく調べたわけではないのですが、どうも型が合っていないと一致とみなしてくれないようです。その場合の対処法としては、ViewModelの型を変更して合わせるか、.chtml内で再度SelectListItemをnewして、Modelの値と一致したらselectedを設定してあげるという技があります。

@Html.DropDownListFor(
    model => model.PrefectureCode,
    Model.PrefectureOptions,
    "都道府県を選択してください",
    new { @class = "title_list"}
)
@Html.DropDownListFor(
    model => model.PrefectureCode,
    Model.PrefectureOptions
    .Select(x => new SelectListItem()
                {
                    Value = x.Value,
                    Text = x.Text,
                    Selected = x.Value == Model.PrefectureCode
                }),
    "都道府県を選択してください",
    new { @class = "title_list"}
)

【C#】Json.netを使う

前提

  • .net Framework 4.5.2
  • Json.netを使用
  • NuGet 2.12 以上
  • MITライセンスなので商用利用も可

NuGetからJson.netをダウンロード&インストール

[Nugetパッケージマネージャ]→[Nugetパッケージマネージャコンソール]を起動します。

プロントが返ってきたら以下のコマンドを入力します。バージョンは公式サイトを確認してお好みのバージョンを指定するとよろしいかと思います。

ちなみにNugetのバージョンが古いと実行ログに「NugetのバージョンはX.xx以上でやってね」とエラーが表示されますので、うまくいかない場合はログはよく確認してみましょう。

Install-Package Newtonsoft.Json -Version 10.0.3

実行ログ

各パッケージのライセンスは、パッケージの所有者によって提供されます。Microsoft は、サードパーティのパッケージに対して一切責任を負わず、いかなるライセンスも提供しません。パッケージには、追加のライセンスが適用される依存関係が含まれる場合があります。依存関係を確認するには、パッケージ ソース (フィード) URL を参照してください。

パッケージ マネージャー コンソール ホストのバージョン 3.0.0.0

利用可能なすべての NuGet コマンドを参照するには、'get-help NuGet' を入力します。

PM> Install-Package Newtonsoft.Json -Version 10.0.3  
'.NETFramework,Version=v4.5.2' を対象とするプロジェクト 'JsonReader' に関して、パッケージ 'Newtonsoft.Json.10.0.3' の依存関係情報の収集を試行しています
DependencyBehavior 'Lowest' でパッケージ 'Newtonsoft.Json.10.0.3' の依存関係の解決を試行しています
パッケージ 'Newtonsoft.Json.10.0.3' をインストールするアクションを解決しています
パッケージ 'Newtonsoft.Json.10.0.3' をインストールするアクションが解決されました
パッケージ 'Newtonsoft.Json.10.0.3' をフォルダー 'c:\users\shin\documents\visual studio 2015\Projects\JsonReader\packages' に追加しています
パッケージ 'Newtonsoft.Json.10.0.3' をフォルダー 'c:\users\shin\documents\visual studio 2015\Projects\JsonReader\packages' に追加しました
パッケージ 'Newtonsoft.Json.10.0.3' を 'packages.config' に追加しました
スクリプト ファイル 'c:\users\shin\documents\visual studio 2015\Projects\JsonReader\packages\Newtonsoft.Json.10.0.3\tools\install.ps1' を実行しています
'Newtonsoft.Json 10.0.3' が JsonReader に正常にインストールされました
PM>

実装

公式サイトにある実装を試してみます。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace JsonReader
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public class Movie
        {
            public string Name { get; set; }
            public string ReleaseDate { get; set; }
            public string[] Genres { get; set; }

        }

        /// <summary>
        /// 読み取りボタン押下時
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            string json = @"{
              'Name': 'Bad Boys',
              'ReleaseDate': '1995-4-7T00:00:00',
              'Genres': [
                'Action',
                'Comedy'
              ]
            }";

            // インスタンスにデシリアライズ
            Movie m = JsonConvert.DeserializeObject<Movie>(json);

            System.Console.WriteLine(m.Name);
            System.Console.WriteLine(m.ReleaseDate);
            System.Console.WriteLine(m.Genres.ToString());


            //Jsonにシリアライズ
            string jsonStr = JsonConvert.SerializeObject(m);
            System.Console.WriteLine(jsonStr);

            // Linqで操作
            JArray array = new JArray();
            array.Add("Manual text");
            array.Add(new DateTime(2000, 5, 23));

            JObject o = new JObject();
            o["MyArray"] = array;

            string jsonStr2 = o.ToString();
            System.Console.WriteLine(jsonStr2);

        }

    }
}

 

実行結果

jsonStrの結果

{"Name":"Bad Boys","ReleaseDate":"1995-4-7T00:00:00","Genres":["Action","Comedy"]}

jsonStr2の結果

{
 "MyArray": [
 "Manual text",
 "2000-05-23T00:00:00"
 ]
}