C# 基于方法参数建立IQueryable

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)

我有一个类似于下面的API方法

是否可以附加IQueryable,以便最终查询具有要执行where语句的项列表,或者是否应该使用SqlQuery属性并构建原始SQL字符串

    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();
}