Asp.net Core - 通用存储库模式 - 使用 TrimStart 搜索
Posted
技术标签:
【中文标题】Asp.net Core - 通用存储库模式 - 使用 TrimStart 搜索【英文标题】:Asp.net Core - Generic Repository Pattern - Search with TrimStart 【发布时间】:2021-10-10 18:43:49 【问题描述】:我正在使用如下的通用存储库模式。
我被指派做这样的任务
Order_Confirmation 表如下
如果用户正常搜索订单,他会像这样输入完整的 OrderID - 000008666000 然后在正常过程中,我使用 FindList 并得到结果
但现在想像这样搜索 - 8666000 他们想在 OrderID 中不带前导零的情况下搜索它。
但在存储库模式中,我无法使用修剪选项编写它。我收到一个错误
var items = _bookingRepository.FindList(s => s.OrderID.TrimStart('0') == value).ToList();
错误
LINQ 表达式 'DbSet
() .Where(j => j.OrderID.TrimStart(0) == __value_0)' 无法翻译。附加信息: 方法'string.TrimStart'的翻译 失败的。如果这个方法可以映射 到您的自定义功能, 见https://go.microsoft.com/fwlink/?linkid=2132413 了解更多信息。要么重写 可以翻译的形式的查询, 或明确切换到客户评估 通过插入对“AsEnumerable”的调用, 'AsAsyncEnumerable'、'ToList' 或 'ToListAsync'。 见https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。
有没有办法解决这个问题? 我知道这会导致很多性能问题。但这是要求。 通用存储库模式
这样的实现
【问题讨论】:
享受:github.com/dotnet/efcore/issues/22924 @ZhiLv 我会用我的解决方案更新这个 @TDM,很高兴听到您找到了解决方案,您可以接受它作为答案,并希望它可以帮助其他社区成员快速解决类似问题。度过愉快的一天! @Zhi Lv 谢谢哥们:) 【参考方案1】:尝试使用EndsWith()
或Contains()
方法过滤数据:
public IActionResult Index()
var value = "8666000";
var result = _repository.FindList(s => s.OrderID.EndsWith(value)).ToList();
return View();
结果如下:
另外,也可以先获取所有记录,然后在使用TrimStart()
方法之前,先调用ToList()
方法,代码如下:
public IActionResult Index()
var value = "8666000";
var result = _repository.GetAll().ToList().Where(s=>s.OrderID.TrimStart('0')==value).ToList();
return View();
结果如下:
【讨论】:
【参考方案2】:能够通过将存储过程与我的确切修剪要求一起使用来解决此问题。
因为正如@Svyatoslav Danyliv 在存储库模式中提到的那样,这是不可能的。 最好的选择是调用存储过程并获取相关数据。
【讨论】:
以上是关于Asp.net Core - 通用存储库模式 - 使用 TrimStart 搜索的主要内容,如果未能解决你的问题,请参考以下文章
如何按照存储库模式在 Asp.Net Core 5.0 项目上实现 .Net Core Identity?
如何在 ASP.NET Core MVC 中使用依赖注入设计存储库模式?
在使用 IdentityDbContext 的情况下,如何在 ASP.NET Core MVC 中使用存储库模式?
asp.net core, Ef core : 在运行时动态映射存储库和服务