LambdicSql でリテラルをパラメータ化したくない場合は DirectValue か N 使おう - お だ のスペース
で、DirectValue 使おうねーって書いたけど、bit型のカラム(.NET の型だと bool) は DirectValue をそのまま使うとエラーなクエリが吐かれます。
using LambdicSql; using System; using System.Data.SqlClient; using static LambdicSql.SqlServer.Symbol; public class table { public int foo { get; set; } public int bar { get; set; } public bool IsValid { get; set; } } public class DB { public table table { get; set; } } class Program { static void Main(string[] args) { var query = Db<DB>.Sql(db => Select(new table { foo = db.table.foo, bar = db.table.bar }). From(db.table). Where(db.table.IsValid == true.DirectValue())); var qs = query.Build(typeof(SqlConnection)).Text; Console.WriteLine(qs); /* SELECT table.foo AS foo, table.bar AS bar FROM table WHERE table.IsValid = True */ } }
なクエリが吐かれてこのまま実行すると、
列名 'True' が無効です。
となってしまいます。
bit (Transact-SQL) - SQL Server | Microsoft Docs
bit 型の場合、0 (false) か 0以外 (true) という扱いなので、取り合えず 0 か 1 を渡したら良さげです。
※文字列 'TRUE'、'FALSE' でもクエリエラーにはなりませんが、前回も書いた暗黙の型変換(convert_implicit)が発生します。
では、table.IsValid == 1.DirectValue()
と書きたいけどこうすると bool型 == int型 になってコンパイルエラーとなります。
なので、1.DirectValue() の結果を bool にキャストします。これも int型 を bool型にそのままキャスト出来ないのでobject型を経由します。
class Program { static void Main(string[] args) { var query = Db<DB>.Sql(db => Select(new table { foo = db.table.foo, bar = db.table.bar }). From(db.table). Where(db.table.IsValid == (bool)(object)1.DirectValue())); var qs = query.Build(typeof(SqlConnection)).Text; Console.WriteLine(qs); /* SELECT table.foo AS foo, table.bar AS bar FROM table WHERE table.IsValid = 1 */ } }
めんどくさー。