如果通过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
子句即可。该代码执行正确的代码路径,但仍返回所有结果。
答案 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中“建立”查询的一种非常常见的模式,因此您肯定在正确的轨道上!