Asp.net 核心 - 通用存储库模式 - 使用 TrimStart 进行搜索

Asp.net Core - Generic Repository Pattern - Search with TrimStart

我正在使用如下通用存储库模式。

我被分配做这样的任务

Order_Confirmation Table 如下所示

如果用户正常搜索订单,他会像这样输入完整的 OrderID - 000008666000 然后在正常程序中,我使用 FindList 并得到结果

但现在想要这样搜索 - 8666000 他们想要在 OrderID 中不带前导零的情况下进行搜索。

但是在存储库模式中,我不能用修剪选项来写它。我遇到错误

 var items = _bookingRepository.FindList(s => s.OrderID.TrimStart('0') == value).ToList();

错误

The LINQ expression 'DbSet<Order_Confirmation>() .Where(j => j.OrderID.TrimStart(0) == __value_0)' could not be translated. Additional information: Translation of method 'string.TrimStart' failed. If this method can be mapped to your custom function, see https://go.microsoft.com/fwlink/?linkid=2132413 for more information. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

有办法解决这个问题吗? 我知道这会带来很多性能问题。但这是要求。 通用存储库模式

这样的实现

尝试使用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();
}

结果是这样的:

能够根据我的确切 trim 要求使用存储过程来解决此问题。

因为正如@Svyatoslav Danyliv 在存储库模式中提到的那样,这是不可能的。 最好的选择是调用存储过程并获取相关数据。