如何使用表达式参数c#实现方法
我想创建一个这样的方法:
var result = database.Search(x=>x.Name, "Entity Name field value"); result = database.Search(x=>x.Id, "Entity Id field value"); result = database.Search(x=>x.Id, "Entity2 Id field value"); result = database.Search(x=>x.FieldAny, "EntityAny FieldAny value");
我该如何实现这个方法?
您可以使用Expression.Equal
将选择器和值转换为谓词:
static IQueryable Search( this IQueryable source, Expression> selector, TValue value) { var predicate = Expression.Lambda>( Expression.Equal( selector.Body, Expression.Constant(value, typeof(TValue)) ), selector.Parameters); return source.Where(predicate); }
然后你只需要做一些事情:
var result = database.SomeEntities.Search(x => x.SomeProp, "value");
如果你想从数据库中做到这一点,那取决于数据库是什么; 例如,使用LINQ-to-SQL,您可以添加其他方法:
static IQueryable Search( this System.Data.Linq.DataContext database, Expression> selector, TValue value) where TSource : class { IQueryable source = database.GetTable (); return Search(source, selector, value); }
并使用:
var result = database.Search(x => x.SomeProp, "value");
坦率地说,我认为使用database.SomeEntities
版本更清楚。
我只能想到这个(有2个通用参数)
public static IEnumerable Search( Expression> expression, TValue value ) { return new List (); }
用法
var result = Search(x => x.Id, 1); var result2 = Search(x => x.Name, "The name");
你可以用对象替换TValue以避免第二个generics参数,但我会坚持这一点。
顺便说一句。 这与这个小助手一起很好用
public static class ExpressionHelpers { public static string MemberName(this Expression> expression) { var memberExpression = expression.Body as MemberExpression; if (memberExpression == null) throw new InvalidOperationException("Expression must be a member expression"); return memberExpression.Member.Name; } }
现在,您可以通过调用获取此示例中的属性名称(Id order Name)
var name = expression.MemberName();
你想要类型动态吗?
public ReturnType Read(string FieldName, object dfVal) { if (Res.IsDBNull(Res.GetOrdinal(FieldName))) return dfVal; try { return (ReturnType)Res.GetValue(Res.GetOrdinal(FieldName)); } catch (Exception ex) { return dfVal; } }