Linq IQueryable整数属性表达式在哪里使用?

Linq IQueryable整数属性表达式在哪里使用?,linq,entity-framework,linq-to-entities,iqueryable,Linq,Entity Framework,Linq To Entities,Iqueryable,所以我有一个查询,我正在使用实体框架LINQ构建。取决于搜索参数和正在搜索的参数类型 我创建了这样一个函数: public static IQueryable<T> WhereInt<T>(this IQueryable<T> query, string propertyName, string contains) { var parameter = Expression.Parameter(typeof(T), "ty

所以我有一个查询,我正在使用实体框架LINQ构建。取决于搜索参数和正在搜索的参数类型

我创建了这样一个函数:

public static IQueryable<T> WhereInt<T>(this IQueryable<T> query, string propertyName, string contains)
        {
            var parameter = Expression.Parameter(typeof(T), "type");
            var propertyExpression = Expression.Property(parameter, propertyName);

            MethodInfo method = typeof(string).GetMethod("First");
            var someValue = Expression.Constant(contains, typeof(string));
            var containsExpression = Expression.Call(propertyExpression, method, someValue);

            return query.Where(Expression.Lambda<Func<T, bool>>(containsExpression, parameter));

        }
searchfield
可以是userid、username、integer或string,理想情况下我希望:

searchfield.value == search.toInt32()
某种特征

我还想使
DateTime
类型也可搜索。也许我会为此制作一个
WhereDateTime

我在
var containsExpression=Expression.Call(propertyExpression,method,someValue)上得到一个错误

这可以很好地处理字符串,但由于以下错误而失败:

Value cannot be null.
Parameter name: method
整数值上没有
.First()
方法。我真的不知道你为什么认为这会帮助你生成一个表达式,比如
searchfield.value==search.toInt32()
(它没有说
第一个
)。改用相等的表达式

我想你是在寻找更多类似的东西

public static IQueryable<T> WhereInt<T>(IQueryable<T> query, string propertyName, string value)
{
    var parameter = Expression.Parameter(typeof(T), "type");
    var propertyExpression = Expression.Property(parameter, propertyName);

    var someValue = Expression.Constant(int.Parse(value), typeof(int));
    var containsExpression = Expression.Equal(propertyExpression, someValue);

    return query.Where(Expression.Lambda<Func<T, bool>>(containsExpression, parameter));
}
公共静态IQueryable WhereInt(IQueryable查询、字符串属性名称、字符串值)
{
var参数=表达式参数(typeof(T),“type”);
var propertyExpression=Expression.Property(参数,propertyName);
var someValue=Expression.Constant(int.Parse(value),typeof(int));
var containsExpression=Expression.Equal(propertyExpression,someValue);
返回query.Where(Expression.Lambda(containsExpression,parameter));
}

string没有名为
First
的方法,这就是GetMethod(“Firts”)返回null的原因。你想干什么。您能提供示例输入和预期结果吗result@RuneFS我试图做的是有这样一个函数:query.Where(SearchField、SearchType、SearchValue);所以我做了两个函数,一个WhereInt和一个WhereString,我输入SearchField和SearchValue,我试图让它返回正确的值(对int使用相等操作“==”,或对string使用.Contains()),可能我错用了“First”,我在WhereString中使用了“Contains”。。。我将Contains改为“First”,希望这与在LINQ中使用==like相同。这个表达式仍然让我困惑
typeof(string)。GetMethod(“First”)
您说您希望比较int,但正在寻找字符串上的方法,您希望得到什么1.First(someVariable)回来?我只是在做类似的实验。除了我的错误,我用了“Equals”,其中你用“Equal”和“propertyexpression,containsexpression”作为lambda的参数,而不是像你这样的“con,parameter”,呵呵。不管怎么说,测试它。所以我得到了这个错误“没有为类型'System.Nullable'1[System.Int32]和'System.Int32'定义二进制运算符Equal.”我猜是因为它是一种“允许nulls”的'int'类型,它会将它识别为int?使用.Constant()会导致失败。@Dexter:是的,没错。您可以修改该方法以将输入视为可为空的int,也可以使用
表达式。Convert(Expression,Type)
模拟从
int
int?
的转换。
public static IQueryable<T> WhereInt<T>(IQueryable<T> query, string propertyName, string value)
{
    var parameter = Expression.Parameter(typeof(T), "type");
    var propertyExpression = Expression.Property(parameter, propertyName);

    var someValue = Expression.Constant(int.Parse(value), typeof(int));
    var containsExpression = Expression.Equal(propertyExpression, someValue);

    return query.Where(Expression.Lambda<Func<T, bool>>(containsExpression, parameter));
}