nameof(xxx) と $"" の組み合わせが便利だ。
https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6#string-interpolation
https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6#nameof-expressions
外出しSQLが書きやすくなる。
// Table名、コラム名と名前を合わせること public class Sample { public int id; public string name; } public class Param { public int Id; } [TestClass] public class TwoWaySqlTest { [TestMethod] public void TestCSharp6StringAndNameOf() { var sample = new Sample { id = 1 }; var sql = $"select {nameof(Sample.name)} from {nameof(Sample)} where {nameof(Sample.id)} = {sample.id}"; Assert.AreEqual("select name from Sample where id = 1", sql); var twoWqySql = $"select {nameof(Sample.name)} from {nameof(Sample)} /*IF pmb.{nameof(Param.Id)} != null*/where {nameof(Sample.id)} = {sample.id}/*END*/"; Assert.AreEqual("select name from Sample /*IF pmb.Id != null*/where id = 1/*END*/", twoWqySql); var twoWayMulti = $@" select {nameof(Sample.name)} from {nameof(Sample)} /*IF pmb.{nameof(Param.Id)} != null*/where {nameof(Sample.id)} = {sample.id}/*END*/ "; Console.WriteLine(twoWayMulti); } }
nameOfの渡す値はリファクタ可能だ(クラス名、プロパティ名の変更に対応)!!!
ない名前だときちんとコンパイルエラーになってくれる。
しかもきちんと文字列の中でコード補完(たとえばSample.とうてばプロパティ一覧がでてくる)も効くのだ。
いままで頑張ってGenして型セーフにしている部分がごそっと要らなくなる可能性ある。
クラスさえつくってしまえばNonSQL的な文字列指定なものでもこまることは減るかもしれない。
上記だとそのままSQLをそのまま流せないが、C# Intrative(VS 2015 Update1から)である程度解決するようになるかも。