对构造的非映射模型列进行数据库端过滤

时间:2016-12-07 10:28:30

标签: c# entity-framework

所以我有一个EF代码优先模型,其属性:Id和Prefix(都映射到数据库)和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成为计算列,但我不知道如何在SQL中轻松制作D4格式(3)
  3. 以某种方式使得这可能在(ToString(" D4")抛出不支持的地方)
  4. 正则表达式将搜索字符串本身(输入)拆分为在字段中单独搜索,显然不是最理想的,因为搜索也可能搜索其他字段 - 实际上模型中有更多可搜索的列。
  5. 你认为这是最好的方法吗?

1 个答案:

答案 0 :(得分: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));