表达式树中的SqlFunctions.StringConvert

时间:2014-05-27 07:42:02

标签: c# linq entity-framework expression-trees

我试图编写一个表达式树,它支持在数值上动态使用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的调用。 所以我的问题是:如何更改上面的代码以使用非字符串类型?

0 个答案:

没有答案