2016-12-07 78 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