我正在嘗試撰寫一個半高級的 LINQ to SQL 查詢來搜索 .NET 6 專案中的物體。我想讓用戶能夠在搜索中輸入諸如“用戶搜索 a OR alternative lookup b OR seperate query from joe”之類的內容。處理用戶輸入后,我的 LINQ 查詢設定如下:
bool isNameSearch = true;
bool isNoteSearch = true;
List<List<string>> _multiSearchList = new()
{
new List<string>() { "user", "search", "a" },
new List<string>() { "alternative", "lookup", "b" },
new List<string>() { "seperate", "query", "from", "joe" }
};
var _query = (from tblHeader in _DbContext.batches
where tblHeader.isDeleted != true
select tblHeader)
_query = _query.Where(x =>
_multiSearchList.Any(y =>
y.All(z =>
(isNameSearch && x.Name.Contains(z)) ||
(isNoteSearch && x.Note.Contains(z))
)
)
);
var _results = await _query.ToListAsync();
var _totalCount = await _query.CountAsync();
問題是,盡管此查詢適用于本地集合,但無法轉換為 sql。有沒有辦法做到這一點?
uj5u.com熱心網友回復:
由于EF核心不支持本地集合(例外情況是查詢Contains),我會建議使用LINQKit擁有PredicateBuilder。
然后您可以為您的特定情況構建謂詞:
bool isNameSearch = true;
bool isNoteSearch = true;
List<List<string>> _multiSearchList = new()
{
new List<string>() { "user", "search", "a" },
new List<string>() { "alternative", "lookup", "b" },
new List<string>() { "seperate", "query", "from", "joe" }
};
var _query = (from tblHeader in _DbContext.batches
where tblHeader.isDeleted != true
select tblHeader)
var mainPredicate = PredicateBuilder.New(_query);
foreach (var sentense in _multiSearchList)
[
var predicate = PredicateBuilder.New(_query);
foreach(var word in sentense)
[
var subPredicate = PredicateBuilder.New(_query);
if (isNameSearch)
subPredicate = subPredicate.Or(x => x.Name.Contains(word));
if (isNoteSearch)
subPredicate = subPredicate.Or(x => x.Note.Contains(word));
predicate = predicate.And(subPredicate)
]
mainPredicate = mainPredicate.Or(predicate);
]
_query = _query.Where(mainPredicate);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/332940.html
