我试图编写一个表达式树,它支持在数值上动态使用StartsWith。 我们的想法是使用此方法根据用户输入构建动态查询,并针对EF 6执行查询。 我已经编写了一个适用于String值的方法。你能帮助我为非字符串值做同样的事吗?
以下是我的方法:
public static IQueryable<TEntity> WhereDynamic<TEntity>( IQueryable<TEntity> queryable, String propertyName,
String queryValue )
{
var startsWithMethodInfo = typeof ( String ).GetMethod( "StartsWith", new[]
{
typeof ( String )
} );
var parameterExpression = Expression.Parameter( typeof ( TEntity ), "x" );
var field = Expression.PropertyOrField( parameterExpression, propertyName );
var startsWith = Expression.Call( field, startsWithMethodInfo, Expression.Constant( queryValue ) );
var expression = Expression.Lambda<Func<TEntity, bool>>( startsWith, parameterExpression );
return queryable.Where( expression );
}
我知道我可以使用SqlFunctions.StringConvert方法在数字值上使用StartsWith,但我不知道如何将它包含在表达式树中。
更新
我发布的代码完美无缺,但仅适用于String类型。现在我想改变它以使用非字符串类型。它现在不适用于数字的问题是EF不支持非字符串类型的StartsWith。 通过调用SqlFunctions.StringConvert:
可以解决此问题movies = movies.Where( y => SqlFunctions.StringConvert(
(Double) y.MovieId).TrimStart().StartsWith( "123" ) );
但我不知道如何在表达式树中包含对SqlFunctions.StringConvert的调用。 所以我的问题是:如何更改上面的代码以使用非字符串类型?