目前我正在對 Plates 表(名稱列)進行關鍵字搜索,但也有一個 Search(在 SearchTerm 列上搜索)表,其中包含我還想搜索并回傳相應平臺的 Plat Id。
下面的代碼有效,但我想盡可能使用 .Include 陳述句來簡化邏輯,盡管我不太確定如何。任何幫助將不勝感激。
if (!string.IsNullOrEmpty(request.Keyword))
{
var searchTermPlateIds = await _db.Search
.Where(x=> x.SearchTerm.ToLower().Contains(request.Keyword.Trim().ToLower()))
.Select(x => x.PlatformId)
.ToListAsync(ct);
var plateFromPlateIds = await _db.Plate
.OrderBy(x => x.Name)
.Where(x => searchTermPlateIds.Contains(x.Id) && x.Status != PlateStatus.Disabled)
.ToListAsync(ct);
plates = await _db.Plates
.OrderBy(x => x.Name)
.Where(x => !string.IsNullOrEmpty(request.Keyword.Trim()) && x.Name.ToLower().Contains(request.Keyword.Trim().ToLower()) && x.Status != PlateStatus.Disabled)
.ToListAsync(ct);
plates = plates.Union(platesFromPlateIds).ToList();
}
uj5u.com熱心網友回復:
記住簡單的事情,Include僅用于加載相關資料,而不用于過濾。
我們可以在這里做的——優化查詢,只向資料庫發出一個請求,而不是三個。
var query = _db.Plates
.Where(x => x.Status != PlateStatus.Disabled);
if (!string.IsNullOrEmpty(request.Keyword))
{
// do not materialize Ids
var searchTermPlateIds = _db.Search
.Where(x => x.SearchTerm.ToLower().Contains(request.Keyword.Trim().ToLower()))
.Select(x => x.PlatformId);
// queryable will be combined into one query
query = query
.Where(x => searchTermPlateIds.Contains(x.Id);
}
// final materialization, here you can add Includes if needed.
var plates = await query
.OrderBy(x => x.Name)
.ToListAsync(ct);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/494228.html
上一篇:為y=>ConstantCollection.Any(x=>y.Contains(x))創建ExpressionTree。不同的范圍引數運算式
