我有一個搜索,我在哪里使用 LINQ 和 EF。當搜索條件為空或為空時,我需要回傳所有內容。目前我使用 if 條件作為解決方案。從那以后,我轉向了這樣的解決方案。
data = data
.Where(p => !string.IsNullOrEmpty(searchriteria1)? p.field1.Contains(searchriteria1) : true)
.Where(p => !string.IsNullOrEmpty(searchriteria2)? p.field2.Contains(searchriteria2) : true);
有一個更好的方法嗎?也許使用擴展或任何更好的方法?
uj5u.com熱心網友回復:
您可以之前檢查搜索條件欄位并以這種方式構建查詢:
IQueryable<Foo> data = context.Foo.AsQueryable();
if(!string.IsNullOrEmpty(searchriteria1))
{
data = data.Where(p => p.field1.Contains(searchriteria1));
}
if (!string.IsNullOrEmpty(searchriteria2))
{
data = data.Where(p => p.field2.Contains(searchriteria2));
}
uj5u.com熱心網友回復:
更短的語法
data.Where(p => (string.IsNullOrEmpty(searchriteria1) || p.field1.Contains(searchriteria1))
&& (string.IsNullOrEmpty(searchriteria2) || p.field2.Contains(searchriteria2)));
uj5u.com熱心網友回復:
public static List<Test> getAll(Expression<Func<Test, bool>> filter = null)
{
return filter == null ? context.Set<Test>().ToList() : context.Set<Test>().Where(filter).ToList();
}
如果你想過濾
var l=getAll(p => p.field1.Contains(searchriteria1)&&p.field2.Contains(searchriteria2));
沒有過濾器
var l=getAll();
uj5u.com熱心網友回復:
問題有兩個部分。如何動態過濾,如何高效過濾。
動態標準
對于第一個問題,在使用 LINQ 時不需要一個包羅萬象的查詢。Catch-all 查詢會導致執行計劃效率低下,因此最好避免它們。
不過,LINQ 不是 SQL。您可以部分構建查詢。只有當您嘗試列舉它時,最終查詢才會被轉換為 SQL。這意味著你可以寫:
if(!String.IsNullOrEmpty(searchCriteria1))
{
query=query=.Where(p=>p.Field1.Contains(searchCriteria1);
}
您可以鏈接多個Where呼叫以獲得等效的多個AND條件。
要使用 eg 生成更復雜的查詢,OR您必須構造適當的Expression<Func<...,bool>>物件,或使用像LINQKit這樣的庫來使之變得可以忍受。
效率
您是否可以撰寫有效的查詢取決于搜索條件。該子句field LIKE '%potato%'不能使用任何索引,最終會掃描整個表。
另一方面,field LIKE 'potato%可以利用覆寫的索引,field因為它將被轉換為范圍搜索,如field >='potato' and field<='potatp.
但是,如果您想實作自動完成或拼寫檢查,您通常希望找到與條件差異最小的文本。
全文檢索
您可以使用全文搜索索引和 FTS 功能(如CONTAINS或FREETEXT )有效地搜索單詞、單詞變體甚至完整短語。
FTS 類似于 Google 或 ... StackOverflow 搜索單詞或句子的方式。
參考形式的檔案:
CONTAINS 可以搜索:
- 一個詞或詞組。
- 單詞或短語的前綴。
- 一個詞接近另一個詞。
- 從另一個詞屈折地生成的詞(例如,詞drive 是drives、driven、driven 和driven 的屈折詞干)。
- 一個詞與使用同義詞詞典的另一個詞同義(例如,“metal”這個詞可以有“aluminum”和“steel”等同義詞)。
另一方面,FREETEXT 更接近 Google/SO 的作業方式,通過搜索整個短語,回傳接近匹配,而不僅僅是完全匹配。
通過DbFunctions.Contains和DbFunctions.FreeText函式,可以在 EF Core 5 及更高版本中使用 CONTAINS 和 FREETEXT 。
這意味著如果你想搜索一個詞或短語,你可以構造一個適當的 FTS 引數并使用:
var searchCriteria1="' Mountain OR Road '";
if(!String.IsNullOrEmpty(searchCriteria1))
{
query=query=.Where(p=>DbFunctions.Contains(p.Field1.Contains(searchCriteria1));
}
這比使用 LINQKit 容易得多。
或搜索ride,riding,rided:
var searchCriteria1="' FORMSOF (INFLECTIONAL, ride) '";
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/374504.html
上一篇:從連接表中選擇計數
