1

我在这里读了一篇文章:N-tier Zombie with wcf

我遇到了以下语句“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));
                }
4

1 回答 1

1

有两种不同的Where扩展方法:

System.Linq.Enumerable.Where

  • 接受一个Func<TSource, Boolean>参数
  • 过滤内存中的集合

System.Linq.Queryable.Where

  • 接受一个Expression<Func<TSource, Boolean>>参数
  • 在数据源过滤集合

如果您不确定您使用的是哪种方法,请将光标放在它上面并按 F1。您将被发送到与上述链接之一相对应的页面。

于 2013-02-05T05:00:14.410 回答