对于我的应用程序,我将“过滤器”对象传递给后端,后端具有属性名称和属性值。
我在互联网上找到以下代码,用动态包含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);
答案 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);