Entity Framework Core - 附加条件 where 子句

mwi*_*son 3 c# sql entity-framework-core

where如果通过 url 传入特定内容,我尝试添加一个附加子句queryParameter,但它似乎不起作用。在我开始执行原始sql之前,我想首先弄清楚我是否做得正确(文档似乎很少,因为我找不到任何东西)

为了简洁起见最小化代码

public IActionResult RetrieveAll([FromQuery] string orderByDate, [FromQuery] string taskStatus)
{
    try
    {
        var taskQuery = (from t in _context.Tasks select t);
        switch(taskStatus)
        {
            case "completed":
                taskQuery.Where(t => t.IsCompleted == true);
                break;
            case "notcompleted":
                taskQuery.Where(t => t.IsCompleted == false);
                break;
        }

        var tasks = taskQuery.ToList();
        return Ok(tasks);
    }
    catch (Exception ex)
    {
        return BadRequest();
    }

}
Run Code Online (Sandbox Code Playgroud)

我想只要简单地附加这个Where条款就可以了。该代码执行正确的代码路径,但它仍然返回所有结果。

Jos*_*ell 6

您可以在此处定义基本查询:

var taskQuery = (from t in _context.Tasks select t);
Run Code Online (Sandbox Code Playgroud)

稍后,您.Where(...)对查询调用扩展方法以进一步过滤查询:

 case "completed":
        taskQuery.Where(t => t.IsCompleted == true);
        break;
Run Code Online (Sandbox Code Playgroud)

但是,.Where(...)不会替换IQueryable,而是返回一个新的 IQueryable。正如您在评论中指出的,您需要将查询替换为新查询,以便您的调用.ToList()稍后返回预期结果。

像这样:

taskQuery = taskQuery.Where(t => t.IsCompleted == true);
Run Code Online (Sandbox Code Playgroud)

这是实体框架中“构建”查询的一种非常常见的模式,因此您绝对走在正确的轨道上!