簡體   English   中英

將 Where 子句添加到 IQueryable<t> 在功能上?</t>

[英]Add Where clause to IQueryable<T> in function?

為什么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);
    }
}

您應該以這種方式更改代碼:

[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);
}

在您的Get()方法中,您創建了一個變量var queryable ,我們稱之為1 ,它包含對該實例的引用,我們稱之為A 所以queryable持有一個參考1->A

現在調用函數AddWhereToQuery(... queryable) queryable是您的變量的副本,我們稱之為2指向相同的引用2->A

因此,現在您創建一個可查詢對象的新實例,我們將其稱為B並將其保存在函數范圍內的可queryable對象中。 所以現在2->B

如您所見,您從未更改過1指向的內容,因此永遠不會使用帶有Where過濾器的實例。 如果您要使用ref則不會制作副本但會傳遞變量本身(無論是結構還是引用類型)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM