.net 在函数中向IQueryable添加Where子句< T>?

zynd9foi  于 2022-12-20  发布在  .NET
关注(0)|答案(2)|浏览(158)

为什么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);
    }
}
0md85ypi

0md85ypi1#

您应该按以下方式更改代码:

[HttpGet]
public IActionResult Get()
{
    var queryable = _db.Articles.AsQueryable();
    queryable = AddWhereToQuery(queryable);

    var queryString = queryable.ToQueryString();

    return Ok(queryString);
}

private IQueryable<Article> AddWhereToQuery(IQueryable<Article> queryable)
{
    return queryable.Where(x => x.Status == ArticleStatus.Active);
}
0sgqnhkj

0sgqnhkj2#

在你的Get()方法中,你创建了一个变量var queryable,我们称之为1,它包含了一个对示例的引用,我们称之为A,所以queryable包含了一个引用。
现在你调用函数AddWhereToQuery(... queryable)queryable是变量的一个副本,我们称之为2,它指向同一个引用。
现在你创建了一个可查询对象的新示例,我们称之为B,然后你把它保存在函数作用域的queryable中,现在是2->B
正如你所看到的,你没有改变1所指向的对象,所以你的Where过滤器的示例不会被使用,如果你使用ref,它不会复制变量,而是传递变量本身(无论是结构体还是引用类型)。

相关问题