创建一个带有StartsWith, EndsWith和Contains的Linq表达式,传递一个Expression
本文关键字:一个 表达式 Linq Expression EndsWith StartsWith 创建 Contains | 更新日期: 2023-09-27 18:16:47
我想创建一个方法,传递类型为Expression<Func<T, string>
的表达式来创建类型为Expression<Func<T, bool>>
的表达式,以过滤字符串属性与StartsWith
, EndsWith
和Contains
方法,如这些表达式:
.Where(e => e.MiProperty.ToUpper().StartsWith("ABC"));
.Where(e => e.MiProperty.ToUpper().EndsWith("XYZ"));
.Where(e => e.MiProperty.ToUpper().Contains("MNO"));
方法应该看起来像:
public Expression<Func<T, bool>> AddFilterToStringProperty<T>(Expresssion<Func<T, string>> pMyExpression, string pFilter, FilterType pFiltertype)
其中FilterType是一个枚举类型,包含上述三种操作(StartsWith
, EndsWith
, Contains
)
试试这个:
public static Expression<Func<T, bool>> AddFilterToStringProperty<T>(
Expression<Func<T, string>> expression, string filter, FilterType type)
{
return Expression.Lambda<Func<T, bool>>(
Expression.Call(
expression.Body,
type.ToString(),
null,
Expression.Constant(filter)),
expression.Parameters);
}
谢谢@dtb。它工作得很好,我为这种情况添加了一个"非空"表达式,如下所示:
public static Expression<Func<T, bool>> AddFilterToStringProperty2<T>(
Expression<Func<T, string>> expression, string filter, FilterType type)
{
var vNotNullExpresion = Expression.NotEqual(
expression.Body,
Expression.Constant(null));
var vMethodExpresion = Expression.Call(
expression.Body,
type.ToString(),
null,
Expression.Constant(filter));
var vFilterExpresion = Expression.AndAlso(vNotNullExpresion, vMethodExpresion);
return Expression.Lambda<Func<T, bool>>(
vFilterExpresion,
expression.Parameters);
}
本文关键字:一个 表达式 Linq Expression EndsWith StartsWith 创建 Contains | 更新日期: 2023-09-27 18:16:47
我想创建一个方法,传递类型为Expression<Func<T, string>
的表达式来创建类型为Expression<Func<T, bool>>
的表达式,以过滤字符串属性与StartsWith
, EndsWith
和Contains
方法,如这些表达式:
.Where(e => e.MiProperty.ToUpper().StartsWith("ABC"));
.Where(e => e.MiProperty.ToUpper().EndsWith("XYZ"));
.Where(e => e.MiProperty.ToUpper().Contains("MNO"));
方法应该看起来像:
public Expression<Func<T, bool>> AddFilterToStringProperty<T>(Expresssion<Func<T, string>> pMyExpression, string pFilter, FilterType pFiltertype)
其中FilterType是一个枚举类型,包含上述三种操作(StartsWith
, EndsWith
, Contains
)
试试这个:
public static Expression<Func<T, bool>> AddFilterToStringProperty<T>(
Expression<Func<T, string>> expression, string filter, FilterType type)
{
return Expression.Lambda<Func<T, bool>>(
Expression.Call(
expression.Body,
type.ToString(),
null,
Expression.Constant(filter)),
expression.Parameters);
}
谢谢@dtb。它工作得很好,我为这种情况添加了一个"非空"表达式,如下所示:
public static Expression<Func<T, bool>> AddFilterToStringProperty2<T>(
Expression<Func<T, string>> expression, string filter, FilterType type)
{
var vNotNullExpresion = Expression.NotEqual(
expression.Body,
Expression.Constant(null));
var vMethodExpresion = Expression.Call(
expression.Body,
type.ToString(),
null,
Expression.Constant(filter));
var vFilterExpresion = Expression.AndAlso(vNotNullExpresion, vMethodExpresion);
return Expression.Lambda<Func<T, bool>>(
vFilterExpresion,
expression.Parameters);
}