Thanks!
Dynamic Expression Tree where #リンク #動的 #式
何もしない場合
return (_ => true);ublic class Predicate
{
// 動的にId or 名前条件用ラムダ式を生成する
// r => r.Id == id || r => r.Name.Contains(name)という式を動的に作る
public static FuncGetPredicate(int id, string name)
{
// パラメータの定義する:r
ParameterExpression param =
Expression.Parameter(typeof(Restaurant), "r");// Idのbodyの左を定義する:r.Id
MemberExpression left = Expression.Property(param, "Id");// Idのbodyの右を定義する:id
ConstantExpression right =
Expression.Constant(id, typeof(int));// Idのbodyを定義する:r.Id == id
BinaryExpression body = Expression.Equal(left, right);// Nameの属性を定義する:r.Name
MemberExpression nameProperty = Expression.Property(param, "Name");// Name定数を定義する:name
ConstantExpression nameConstant = Expression.Constant(name, typeof(string));// Nameのbodyを定義する:r.Name.Contains(name)
MethodCallExpression nameBody = Expression.Call(nameProperty,
typeof(string).GetMethod("Contains"), nameConstant);// 全体のbodyを定義する
// r => r.Id == id || r => r.Name.Contains(name)
BinaryExpression body = Expression.Or(idBody, nameBody);// 式ツリーを(r => r.Id == id || r => r.Name.Contains(name))を組み立て、
// 実行コードにコンパイルする
return Expression.Lambda>(
body, param).Compile();
}
}
StringComparison comparison = StringComparison.InvariantCultureIgnoreCase; pidBody = Expression.Call(pidProperty, typeof(string).GetMethod("StartsWith", new Type[] {typeof(string), comparison.GetType() }), pidConstant, Expression.Constant(comparison));
stackoverflow.com
stackoverflow.com
ameblo.jp
ofnirs.blogspot.com
tech.blog.aerie.jp
Thanks!
C++ コンテナ逆順処理
Thanks!
EF + LEFT JOIN
Thanks!