我正在使用通用存储库,如下所示:
itemsList = (from myrow in UoW.FileRepository.Get()
select new FileModel()
{record_id = myrow.type_id,
descr = myrow.descr}).ToList();});
这是Get方法:
public virtual IEnumerable<TEntity> Get()
{
// _aQuery = _theDbContext.Set<TEntity>();
IEnumerable<TEntity> query = _aQuery;
return query;
}
如果要创建类似的查询以在特定字段中搜索特定字符串,我将如何实现通用linq lambda表达式?在我的视图模型中,我想调用类似以下内容的东西:
from myrow in UoW.FileRepository.Srch(nameofFieldToSearch, searchString).
查询看起来像这样吗?
public IEnumerable<TEntity> Srch(Expression<Func<TEntity, bool>> expression)
{
IEnumerable<TEntity> srchList = _aQuery.ToList();
return srchList.Where(????);
}
谢谢您的建议。
编辑-----------------------我在通用存储库类中拥有所有查询,例如Get和Srch,现在只需要知道如何声明查询即可在存储库类中,以及如何使用我的viewmodel中的搜索字符串调用它。我不确定在哪里/何时实现和编译是否达成共识?我看到了另一个讨论http://www.fascinatedwithsoftware.com/blog/post/2012/01/10/More-on-Expression-vs-Func-with-Entity-Framework.aspx,下面我引用它来询问是否在这里建议使用相同的方法吗?再次感谢你。
“探查器告诉我们,LoadMyEntities被调用了很多次,这占用了我们大量的CPU时间。下面的简单更改解决了这个问题。您能猜出为什么吗?”
public IEnumerable<MyEntity> LoadMyEntities(Func<MyEntity, bool> predicate)
{return Context.MyEntities.Where(predicate);}
“参数现在是Func <>而不是Expression>。之所以如此与众不同,是因为以Expression形式的谓词被传递给SQL Server,而作为Func传递的谓词却没有传递。通常,您希望SQL Server为您做更多的事情,而Expression是一个正确的选择,但是在这种情况下,我们想在上下文中预加载整个表-这正是Func会的。
在原始版本中,谓词是一个Expression,因此编译器使用了扩展IQueryable的Where。因此,该谓词被传递给SQL Server,SQL Server忠实地将仅一行返回给上下文。下次我们调用LoadMyEntities时,实体框架必须再次调用SQL Server。”
这将是使用表达式树的简单实现。以下是完整的解决方案:
获取方法的表达式的Srch
方法:
Public Expression<Func<TEntity, bool>> SrchExpression(string nameofFieldToSearch, string searchString)
{
var parameterType = Expression.Parameter(typeof(TEntity), "obj");
var memberExpression = Expression.Property(typeof(string), nameofFieldToSearch)
// Calls Extension method created underneath
var filtersMethodInfo = typeof(StringExtensions).GetMethod("Contains", new[] { typeof(string), typeof(string) });
var filtersConstantExpression = Expression.Constant(searchString, typeof(string));
var finalExpression = Expression.Call(null, filtersMethodInfo, memberExpression, filtersConstantExpression)
return Expression.Lambda<Func<TEntity, bool>>(finalExpression, parameterType)
}
//为Contains创建一个String扩展方法
public static class StringExtensions
{
public static bool Contains(this string source, string searchString)
{
return source?.IndexOf(subString, StringComparison.OrdinalIgnoreCase) >= 0;
}
}
现在,您的Srch
方法应如下所示:
public IEnumerable<TEntity> Srch(Expression<Func<TEntity, bool>> expression)
{
Func<TEntity, bool>> func = expression.Compile();
IEnumerable<TEntity> srchList = _aQuery.Where(o => func(o));
return srchList;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句