实体框架核心-附加条件where子句

时间:2019-02-20 02:38:14

标签: c# sql entity-framework-core

如果通过URL传递了特定的where,我试图添加一个附加的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();
    }

}

我当时想,只需附加Where子句即可。该代码执行正确的代码路径,但仍返回所有结果。

1 个答案:

答案 0 :(得分:2)

您在此处定义基本查询:

var taskQuery = (from t in _context.Tasks select t);

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

 case "completed":
        taskQuery.Where(t => t.IsCompleted == true);
        break;

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

赞:

taskQuery = taskQuery.Where(t => t.IsCompleted == true);

这是在Entity Framework中“建立”查询的一种非常常见的模式,因此您肯定在正确的轨道上!