私は式を学習しており、以下のコードを使用して、データベース モデルに対する式を追加します (EF4 - SQL ではなく ORACLE!)。
これはOracleに対して完全に機能し、次のような述語を動的に構築でき"CustomerId", "Contains", 2
ますf=>f.CustomerId.ToString().ToLower().Contains("2")
ただし、SQL Server に対して試行すると、呼び出す必要があるため失敗しますが、それをSqlFunctions.StringConvert
Lambda に含める方法がわかりません。
私の最終結果は次のようになります。
f=> SqlFunctions.StringConvert(f.CustomerId).ToLower().Contains("2")
どうも :)
編集:私が試したことの例を追加しました
このコードは、ほとんど機能しているように見えます。
ただし、var sqlExpression
行にエラーがスローされます
Expression of type 'System.Double' cannot be used for parameter of type 'System.Nullable`1[System.Double]' of method 'System.String StringConvert(System.Nullable`1[System.Double])'
MethodInfo convertDouble = typeof(Convert).GetMethod("ToDouble",new Type[]{typeof(int)});
var cExp = Expression.Call(convertDouble, left.Body);
var entityParam = Expression.Parameter(typeof(TModel), "f");
MethodInfo sqlFunc = typeof(SqlFunctions).GetMethod("StringConvert", new Type[] { typeof(double) });
var sqlExpression = Expression.Call(sqlFunc, cExp);
MethodInfo contains = typeof(string).GetMethod("Contains", new[] { typeof(string) });
right = Expression.Constant(value.ToString(), typeof(string));
var result = left.AddToString().AddToLower().AddContains(value.ToString());
return result;
public static Expression<Func<T, string>> AddToString<T, U>(this Expression<Func<T, U>> expression)
{
return Expression.Lambda<Func<T, string>>(
Expression.Call(expression.Body,
"ToString",
null,
null),
expression.Parameters);
}
public static Expression<Func<T, string>> AddToLower<T>(this Expression<Func<T, string>> expression)
{
return Expression.Lambda<Func<T, string>>(
Expression.Call(expression.Body,
"ToLower",
null,
null),
expression.Parameters);
}
public static Expression<Func<T, bool>> AddContains<T>(this Expression<Func<T, string>> expression, string searchValue)
{
return Expression.Lambda<Func<T, bool>>(
Expression.Call(
expression.Body,
"Contains",
null,
Expression.Constant(searchValue)),
expression.Parameters);
}