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 : 在运行时动态映射存储库和服务

MVC3 EF 工作单元 + 通用存储库 + Ninject

如何从 ASP.NET Core 3.1 中的存储库类创建确认电子邮件回调