我正在尝试为现有的Func属性列表创建Contains子句,但我不知道如何将它附加到以前传递的属性列表。
public static List<Func<T, bool>> GetPropertyWhereClauses<T>(List<Func<T, object>> properties, string queryPhrase)
{
var whereClauses = new List<Func<T, bool>>();
foreach (var property in properties)
{
/// how to add Contains to existing property Func<T, object> ?
whereClauses.Add(property.Contains(queryPhrase));
}
return whereClauses;
}
如何添加?我尝试使用一些Expression.Call,但它没有将Func作为参数。
答案 0 :(得分:1)
如果您只想将每个Func<T, object>
转换为Func<T, bool>
,如果第一个func返回对象转换为字符串包含queryPhrase,您可以这样做:
public static List<Func<T, bool>> GetPropertyWhereClauses<T>(List<Func<T, object>> funcs, string queryPhrase)
{
var whereClauses = new List<Func<T, bool>>();
foreach (var func in funcs)
{
whereClauses.Add(o => func(o).ToString().Contains(queryPhrase));
}
return whereClauses;
}
或者更好的LINQ:
public static List<Func<T, bool>> GetPropertyWhereClauses<T>(List<Func<T, object>> funcs, string queryPhrase)
{
return funcs.Select(func => new Func<T, bool>(o => func(o).ToString().Contains(queryPhrase)).ToList();
}
如果reutrn对象实际上是一个列表而不是一个字符串,你可以用类似的方式检查queryPhrase是否是列表的一部分:
public static List<Func<T, bool>> GetPropertyWhereClauses<T>(List<Func<T, object>> funcs, string queryPhrase)
{
return funcs.Select(func => new Func<T, bool>(o => ((List<string>)func(o)).Contains(queryPhrase)).ToList();
}
如果你可以将它变成你期望的真实类型,那么让你的func返回tpye并不是最好的主意,它将为你节省所有多余的投射。