为什么Where子句不应用于AddWhereToQuery函数中的IQueryable?
它应该是引用类型,我不明白为什么这段代码不能像我期望的那样工作。
[Route("/testing")]
public class MyTestController : ControllerBase
{
private readonly YieldigoDbContext _db;
public MyTestController(YieldigoDbContext db)
{
_db = db;
}
[HttpGet]
public IActionResult Get()
{
var queryable = _db.Articles.AsQueryable();
AddWhereToQuery(queryable);
var queryString = queryable.ToQueryString();
return Ok(queryString);
}
private void AddWhereToQuery(IQueryable<Article> queryable)
{
queryable = queryable.Where(x => x.Status == ArticleStatus.Active);
}
}
当我添加ref关键字时,它工作得很好,但为什么ref是必要的呢
[Route("/testing")]
public class MyTestController : ControllerBase
{
private readonly YieldigoDbContext _db;
public MyTestController(YieldigoDbContext db)
{
_db = db;
}
[HttpGet]
public IActionResult Get()
{
var queryable = _db.Articles.AsQueryable();
AddWhereToQuery(ref queryable);
var queryString = queryable.ToQueryString();
return Ok(queryString);
}
private void AddWhereToQuery(ref IQueryable<Article> queryable)
{
queryable = queryable.Where(x => x.Status == ArticleStatus.Active);
}
}
2条答案
按热度按时间0md85ypi1#
您应该按以下方式更改代码:
0sgqnhkj2#
在你的
Get()
方法中,你创建了一个变量var queryable
,我们称之为1
,它包含了一个对示例的引用,我们称之为A
,所以queryable
包含了一个引用。现在你调用函数
AddWhereToQuery(... queryable)
,queryable
是变量的一个副本,我们称之为2
,它指向同一个引用。现在你创建了一个可查询对象的新示例,我们称之为
B
,然后你把它保存在函数作用域的queryable
中,现在是2->B
。正如你所看到的,你没有改变
1
所指向的对象,所以你的Where
过滤器的示例不会被使用,如果你使用ref
,它不会复制变量,而是传递变量本身(无论是结构体还是引用类型)。