2016-12-07 69 views
0

所以我有一個EF代碼優先模型屬性:Id和前綴(都映射到數據庫)和FullId(未映射)定義爲數據庫側濾波

FullId => Prefix + "-" + Id.ToString("D4") 

在C#模型中。例如FullId是

ABC-0045或XER-0001

現在我需要在數據庫這個 FullId字段進行篩選,即

db.Entity.Where(x=>x.FullId.Contains(search)) 

但搜索不只是ID ,但對於模型中的任何內容(其他列都省略,例如:名稱,地址等)。 where謂詞是動態構建的。

爲了解決這個問題到目前爲止,我還認爲:

  1. 物化FullId到數據庫(缺點:數據的複製,需要在前綴變爲手動更新)
  2. 製作FullId計算列,但我不知道如何輕鬆地D4格式SQL(3)
  3. 不知怎的,使內,其中(的ToString(「D4」)拋出不支持)
  4. 正則表達式拆分搜索字符串本身(輸入)的領域分別搜索這成爲可能,很明顯因爲搜索可能潛在的不理想搜索其他領域 - 現實中模型中有更多可搜索的列。

你認爲最好的方法是什麼?

回答

0

您沒有指定search的樣子,因此我假設您正在搜索已匹配完整ID模式的特定完整ID值,如ABC-0045

因此,一個好的解決方案是將您正在搜索的完整ID分開並單獨過濾列。

var prefix = search.Split('-')[0]; 
var id = search.Split('-')[1]; 
db.Entity.Where(x => x.Id == id && x.Prefix.Equals(prefix)); 
+0

是的,這將工作,但正如我在第4)點所述,數據庫中有更多的列需要搜索。我編輯了這個問題,使其更加明顯。也許沒有什麼好的方法來做到這一點。 – NeverStopLearning

+0

那麼請稍微解釋一下你搜索的目的。你想實現全文搜索還是它是什麼? – Naduweisstschon

+0

Yeas,搜索變量包含任意數據並且對多列進行搜索。這是一個有點奇怪的用例,同意。我認爲,如何解決這個問題真的沒有什麼好方法。 – NeverStopLearning