如何使用表达式参数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; } }