2016年2月12日金曜日

いまさらながら Linq to SQL

必要だったのでLinq to SQL 触ってみましたが
いろいろ細かいところが面倒だったので
対応した内容をメモ


 Binary形式の比較ができない


下記のようなクラスを作成し

 public static class BinaryComparer
    {
        public static int Compare(this Binary b1, Binary b2)
        {
            throw new NotImplementedException();
        }
    }


where内で使う

hoge.Where(row =>BinaryComparer.Compare(binary, row.binary_column) == 0) ;



PropertyInfoを使ったカラム指定



public static Expression<Func<TItem, bool>> PropertyEquals<TItem, TValue>(
             PropertyInfo property, TValue value)
        {
            var param = Expression.Parameter(typeof(TItem));
            var body = Expression.Equal(Expression.Property(param, property),
                Expression.Constant(value));
            return Expression.Lambda<Func<TItem, boo>>(body, param);
        }


次のように利用する

hoge.Where(PropertyEquals<hogetype, byte>(propertyInfo, somebyte));


上記だとnullableに対応していないので
nullable対応版

public static Expression<Func<TItem, bool>> NullablePropertyEquals<TItem, TValue>(
             PropertyInfo property, TValue? value) where TValue : struct
        {
            var param = Expression.Parameter(typeof(TItem));
            var body = Expression.Equal(
                    Expression.Property(param, property),
                    Expression.Constant(value, typeof (TValue?)));
            return Expression.Lambda<Func<TItem, bool>>(body, param);
        }

nullableでしか動かないので注意
両方に対応したメソッドも作れるような気はするけど
取りあえずここまで




0 件のコメント: