您可以使用以下方法将选择器和值转换为谓词Expression.Equal
:
static IQueryable<TSource> Search<TSource, TValue>(
this IQueryable<TSource> source,
Expression<Func<TSource,TValue>> selector,
TValue value)
{
var predicate = Expression.Lambda<Func<TSource,bool>>(
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<TSource> Search<TSource, TValue>(
this System.Data.Linq.DataContext database,
Expression<Func<TSource, TValue>> selector,
TValue value) where TSource : class
{
IQueryable<TSource> source = database.GetTable<TSource>();
return Search(source, selector, value);
}
并使用:
var result = database.Search<SomeEntity, string>(x => x.SomeProp, "value");
坦率地说,我认为使用该database.SomeEntities
版本更清晰。