基于属性字符串名称

时间:2017-02-15 09:58:13

标签: c# .net entity-framework linq

对于我的应用程序,我将“过滤器”对象传递给后端,后端具有属性名称和属性值。

我在互联网上找到以下代码,用动态包含ef

public static IOrderedQueryable<T> Contains<T>(this IQueryable<T> queryable, string propertyName, string propertyValue)
        {
            var parameterExp = Expression.Parameter(typeof(T), "type");
            var propertyExp = Expression.Property(parameterExp, propertyName);
            var method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
            var someValue = Expression.Constant(propertyValue, typeof(string));
            var containsMethodExp = Expression.Call(propertyExp, method, someValue);

            var expression = Expression.Lambda<Func<T, bool>>(containsMethodExp, parameterExp);

            var expcall = Expression.Call(typeof(Queryable), "Where", new[] {typeof(T)}, queryable.Expression,Expression.Quote(expression));

            return (IOrderedQueryable<T>)queryable.Provider.CreateQuery<T>(expcall);
        }

我称之为:

query = query.Contains(filter.Property, (string)filter.Value);

现在我正试图找到相同的比较来做到这一点:

query = query.Where(x => x.Status == filter.Value);

x.Status是一个enum所以

query = query.Where(x => x.Status.Equals(filter.Value));

引发

  

无法创建“System.Object”类型的常量值。此上下文仅支持原始类型或枚举类型

即使我将它转换为int。

所以我需要做'=='而不是equals但是我不知道如何构建一个方法,比如包含一个没有像Contains或Equals这样的方法名称的方法

我想要什么,像这样:

query = query.IsTheSame(filter.Property, (Status)filter.Value);

2 个答案:

答案 0 :(得分:0)

==运算符检查完全匹配,如果您使用的是等效但不同的对象,它们之间的==运算符将为false。 Equals在类似但不同的对象的情况下都是如此。所以我猜解决方案是

query = query.Where(x => (x.Status != null) && (x.Status.Equals(val)));

答案 1 :(得分:0)

  

所以我需要做&#39; ==&#39;而不是等于但我不知道如何构建像没有像Contains或Equals这样的方法名称的Contains方法

由于Expression.Equal方法,这实际上更加容易。

以下是一个示例实现(处理嵌套属性/字段的奖励):

public static IQueryable<T> WhereEquals<T>(this IQueryable<T> source, string memberPath, object value)
{
    var parameter = Expression.Parameter(typeof(T), "e");
    var member = memberPath.Split('.').Aggregate((Expression)parameter, Expression.PropertyOrField);
    var predicate = Expression.Lambda<Func<T, bool>>(
        Expression.Equal(member, Expression.Constant(value)),
        parameter);
    return source.Where(predicate);
}

您可以这样称呼:

query = query.WhereEquals(filter.Property, filter.Value);