【问题标题】:IQueryable Where integer property expression usage?IQueryable 整数属性表达式在哪里使用?
【发布时间】:2012-10-22 17:43:36
【问题描述】:

所以我有一个使用实体框架 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));

        }

这样使用:

WhereInt(DCs, searchfield, search);

searchfield 可以是用户 ID、用户名、整数或字符串,理想情况下我想这样做:

searchfield.value == search.toInt32()

某种功能。

我还想让DateTime 类型也可搜索。也许我会为此创建一个WhereDateTime

var containsExpression = Expression.Call(propertyExpression, method, someValue); 出现错误

这适用于字符串,但失败并出现错误:

Value cannot be null.
Parameter name: method

【问题讨论】:

  • string 没有名为 First 的方法,这就是 GetMethod("Firts") 返回 null 的原因。你想做什么。您能否提供样本输入和预期结果
  • @RuneFS 我想做的是有一个这样的函数:query.Where(SearchField, SearchType, SearchValue);所以我做了两个函数,一个 WhereInt 和一个 WhereString,我输入 SearchField 和 SearchValue,我试图让它返回正确的值(对 int 使用相等操作“==”,或者对字符串使用 .Contains() )
  • 也许我错误地使用了“First”,我在 WhereString 中使用了“Contains”...我将 Contains 更改为“First”,希望这与使用 == 一样LINQ。
  • 这个表达式仍然让我感到困惑typeof(string).GetMethod("First") 你说你想比较整数但正在寻找一个字符串方法,你期望 1.First(someVariable) 返回什么?

标签: linq entity-framework linq-to-entities iqueryable


【解决方案1】:

整数值没有.First() 方法。我真的不知道您为什么认为这会帮助您生成像 searchfield.value == search.toInt32() 这样的表达式(在任何地方都不会说 First)。请改用 Equal 表达式。

我认为您正在寻找更多类似这些方面的东西。

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));
}

【讨论】:

  • 我只是在尝试类似的东西。除了我的错误是我有“Equals”,你有“Equal”和“propertyexpression, containsexpression”作为 lambda 的参数,而不是像你这样的“con,参数”呵呵。无论如何,测试一下。
  • 所以我收到此错误“二元运算符 Equal 没有为类型 'System.Nullable`1[System.Int32]' 和 'System.Int32' 定义。”
  • 我猜是因为它是一种“允许空值”的“int”类型,它会将其识别为int?使用 .Constant() 会失败。
  • @Dexter:是的,没错。您可以修改方法以将输入视为可为空的 int,或使用 Expression.Convert(Expression, Type) 模拟从 intint? 的转换。
猜你喜欢
  • 1970-01-01
  • 2012-08-05
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 2021-01-04
  • 2014-12-25
  • 1970-01-01
相关资源
最近更新 更多