[英]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.