c# - 根据方法参数构建 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)
    {
        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
    }

最佳答案

Is it possible to append the IQueryable so the final query has a list of items to execute a where statement.

是的。您的代码应该可以正常工作。如果你想构建一个 IEnumerable<Message>,你只需要执行这个对于结果。

//Here it should execute against Where date >= and date <= and flag = 1
return query.ToList();

请注意,您可以使用 AsEnumerable()甚至只是返回 query直接(因为 IQueryable<T> 实现了 IEnumerable<T> ),但如果用户多次枚举您的结果,这将导致问题,因为每次枚举都会命中数据库。

我个人会这样写:

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

关于c# - 根据方法参数构建 IQueryable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15686793/

相关文章:

c# - 通过套接字发送消息的线程安全类

c# - 2 列范围之间的 Linq 值

c# - 如何将复杂的 linq 映射到对象

.net - 使用.NET 4.5.1,如何使用ETW提供的一些非直观属性?

c# - System.Text.StringBuilder 限制

c# - 使用 Entity Framework 4 选择具有非标量键列表的多行的好方法

c# - Dapper 错误 : Could not load type 'Dapper.SqlMapper'

javascript - 一种方法需要 HttpGet 属性,但另一种方法不需要

c# - 从 WCF 测试客户端调用时,WebBrowser 控件未在自承载 WCF 服务中导航

c# - 堆栈集合在 C# 2.0 中缺少 shift 和 unshift