簡體   English   中英

C# LINQ 中的多短語搜索無法轉換為 SQL

[英]Multi phrase search in C# LINQ Cannot be translated to SQL

我正在嘗試編寫一個半高級的 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。 有沒有辦法做到這一點?

由於 EF Core 不支持本地集合查詢( Contains除外),我建議使用具有PredicateBuilder LINQKit

然后您可以為您的特定案例構建謂詞:

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

暫無
暫無

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

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