C# 基于方法参数建立IQueryable
我有一个类似于下面的API方法 是否可以附加IQueryable,以便最终查询具有要执行where语句的项列表,或者是否应该使用SqlQuery属性并构建原始SQL字符串C# 基于方法参数建立IQueryable,c#,.net,entity-framework,generics,iqueryable,C#,.net,Entity Framework,Generics,Iqueryable,我有一个类似于下面的API方法 是否可以附加IQueryable,以便最终查询具有要执行where语句的项列表,或者是否应该使用SqlQuery属性并构建原始SQL字符串 public IEnumerable<Message> GetMessagesFromApi(DateTime? dateFrom = null, DateTime? dateTo = null, int flag = -1, int messageType = 1, bool media =false)
public IEnumerable<Message> GetMessagesFromApi(DateTime? dateFrom = null, DateTime? dateTo = null, int flag = -1, int messageType = 1, bool media =false)
{
if (dateFrom == null)
dateFrom = DateTime.MinValue;
if (dateTo == null)
dateTo = DateTime.MaxValue;
IQueryable<Message> query = null;
query = db.Messages.Where(x => x.Created >= dateFrom && x.Created <= dateTo);
if (flag >= 0)
{
//Append the where statement on dates to now include Flag
query = query.Where(x => x.Flag == flag);
}
//Here it should execute against Where date >= and date <= and flag = 1
}
public IEnumerable GetMessagesFromApi(DateTime?dateFrom=null,DateTime?dateTo=null,int-flag=-1,int-messageType=1,bool-media=false)
{
if(dateFrom==null)
dateFrom=DateTime.MinValue;
if(dateTo==null)
dateTo=DateTime.MaxValue;
IQueryable查询=null;
query=db.Messages.Where(x=>x.Created>=dateFrom&&x.Created=0)
{
//将日期上的where语句附加到now include标志
query=query.Where(x=>x.Flag==Flag);
}
//在这里,它应该根据Where date>=和date执行
是否可以附加IQueryable,以便最终查询具有要执行where语句的项列表
是的。你的代码应该可以正常工作。如果你想为结果构建一个IEnumerable
,你只需要执行这个
//Here it should execute against Where date >= and date <= and flag = 1
return query.ToList();
我使用的是EF,我可以使用return AsEnumerable()@Jon Yes,尽管使用AsEnumerable()吗
,如果调用方枚举它两次,它将命中数据库两次…啊,好的,谢谢,然后将返回一个列表。通过查看代码,似乎查询每次都会被覆盖appended@Jon看看我的更新-查询将成为一个新查询,在旧查询后面附加了“Where”子句,因为它正在执行query=query.Where。。
public IEnumerable<Message> GetMessagesFromApi(DateTime? dateFrom = null, DateTime? dateTo = null, int flag = -1, int messageType = 1, bool media =false)
{
IQueryable<Message> query = db.Messages;
if(dateFrom.HasValue)
query = query.Where(x => x.Created >= dateFrom);
if(dateTo.HasValue)
query = query.Where(x => x.Created <= dateTo);
if(flag >= 0)
query = query.Where(x => x.Flag == flag);
// others as needed, such as media...
return query.ToList();
}