我正在尝试创建一个类来执行动态过滤,取决于我将发送到其“filter”方法的参数,但我在构建查询时遇到了一些困难。
通过我的下面的代码更容易解释,我只是在尝试根据输入应用一些过滤器:
通过我的下面的代码更容易解释,我只是在尝试根据输入应用一些过滤器:
public class PeopleManager : Controller
{
private readonly MyPeopleContext _context;
public PeopleManager(PeopleContext context)
{
_context = context;
}
public IEnumerable<Person> filter (int? id, string name, int? age)
{
var peoplequery = _context.People;
if(id!=null)
{
peoplequery = peoplequery .Where(p => p.Id.Equals(id));
}
if(name!="")
{
peoplequery = peoplequery .Where(p => p.Name.Contains(name));
}
if(age!=null)
{
peoplequery = peoplequery .Where(p => p.Age.Equals(age));
}
return peoplequery;
}
}
显然,我的代码没有起作用,根据我找到的这个问题:
无法将类型'System.Linq.IQueryable'隐式转换为类型'System.Data.Entity.DbSet'
我已经成功地编辑了我的代码如下:
public IEnumerable<Person> filter (int? id, string name, int? age)
{
var people = _context.People;
var peoplequery = from p in people select people;
if(id!=null)
{
peoplequery = peoplequery .Where(p => p.Id.Equals(id));
}
if(name!="")
{
peoplequery = peoplequery .Where(p => p.Name.Contains(name));
}
if(age!=null)
{
peoplequery = peoplequery .Where(p => p.Age.Equals(age));
}
return peoplequery;
}
但是这样做,我无法在我的lambda表达式中访问人的属性,例如id、name等。
我该如何构建这个条件查询而没有任何错误?
if
语句块内的var
。目前代码不能编译通过。同时在开头使用简单的var peoplequery = _context.People.AsQueryable();
。 - Ivan StoevAsQueryable()
,就完成了 :) 我的意思是,不要使用from p in ...
。 - Ivan StoevIQueryable<Person> people = _context.People;
或者var people = from p in _context.People select p;
(注意是select p
而不是people
)一样。但是AsQueryable()
更简短。 - Ivan StoevIQueryable<T>
继承了IEnumerable<T>
,所以没有问题(从面向对象编程的角度来看,queryable 是 enumerable)。 - Ivan Stoevvar peoplequery = _context.People;
更改为IQueryable<Person> peoplequery = _context.People;
应该可以解决这个问题。 - Marc Gravell