将IQueryable作为IEnumerable调用,在客户端进行筛选
本文关键字:客户端 筛选 IQueryable 作为 IEnumerable 调用 | 更新日期: 2023-09-27 17:57:32
我在这里读了一篇文章:带wcf的N层僵尸。
我遇到了以下语句"zombieRepository.GetAll().Where(funcComp)",GetAll()
返回一个IQueryable
,但where
语句是在Func<>
参数中传递的,该参数实际上将IQueryable
接口作为IEnumerable
接口调用。
这个调用的问题是过滤器是在客户端完成的(读取所有dtos.ZombieIncident
,然后应用过滤器),而不是在sql server端,我的理解正确吗?
代码片段:
var paramStart = Expression.Parameter(typeof(dtos.ZombieIncident), "x");
Expression<Func<dtos.ZombieIncident, bool>> func = Expression.Lambda<Func<dtos.ZombieIncident, bool>>(
Expression.Call(Expression.Property(paramStart,
typeof(dtos.ZombieIncident).GetProperty(propertyName).GetGetMethod()),
typeof(String).GetMethod(searchType.ToString(), new Type[] { typeof(String) }),
new Expression[] { Expression.Constant(searchValue, typeof(string)) }),
new ParameterExpression[] { paramStart });
Func<dtos.ZombieIncident, bool> funcComp = func.Compile();
foreach (dtos.ZombieIncident zombie in zombieRepository.GetAll().Where(funcComp).ToList())
{
zombies.Add(ZombieIncidentDTOMapper.FromDTO(zombie));
}
有两种不同的Where
扩展方法:
System.Linq.Enumerable.Where
:
- 接受
Func<TSource, Boolean>
参数 - 过滤内存中的集合
System.Linq.Queryable.Where
:
- 接受
Expression<Func<TSource, Boolean>>
参数 - 在数据源筛选集合
如果您不确定使用的是哪种方法,请将光标放在上面,然后按F1。您将被发送到与上述链接之一对应的页面。