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 在存储库模式中提到的那样,这是不可能的。
最好的选择是调用存储过程并获取相关数据。
我正在使用如下通用存储库模式。
我被分配做这样的任务
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 在存储库模式中提到的那样,这是不可能的。 最好的选择是调用存储过程并获取相关数据。