【发布时间】:2021-09-20 03:27:42
【问题描述】:
我有以下代码,我的问题是,当没有找到数据时,返回的最佳做法是什么? 目前我正在返回 null,但有没有更好的建议方法,比如抛出异常或错误?任何指导都会被欣赏。 这是我的 Web api 获取端点的 Repository 方法。
public async Task<CustomerProfileDto> Handle(GetCustomerProfileQuery request, CancellationToken cancellationToken)
{
var query = from Customer in _context.Customers
.Include("SystemCustomers")
.Include("SystemCustomers.SystemCustomerCreditors")
.Include("SystemCustomers.SystemCustomerCreditors.Creditor")
.Include("SystemCustomers.SystemRole")
.Include("SystemCustomers.SystemRole.System")
join SystemCustomer in _context.SystemCustomers on Customer.Id equals SystemCustomer.CustomerId
join SystemRoles in _context.SystemRoles on SystemCustomer.SystemRoleId equals SystemRoles.Id
join Systems in _context.Systems on SystemRoles.SystemId equals Systems.Id
join SystemCustomerCreditor in _context.SystemCustomerCreditors on SystemCustomer.Id equals SystemCustomerCreditor.SystemCustomerId
join Creditor in _context.Creditors on SystemCustomerCreditor.CreditorId equals Creditor.Id
where Customer.Email == request.Email &&
Systems.Code == request.SystemCode &&
SystemCustomer.SystemRole.Id == _context.SystemCustomers.Where(au => au.CustomerId == SystemCustomer.CustomerId)
.OrderByDescending(au => au.SystemRole.RoleType.Priority)
.FirstOrDefault().SystemRole.Id &&
(request.ExternalReference == null || Customer.ExternalReference == request.ExternalReference)
select new
{
CustomerData = Customer,
Creditorconfig = JsonConvert.DeserializeObject<AuthenticationConfiguration>(Creditor.AuthenticationConfigJObjectData)
};
if (query.Any())
{
///TO-DO: Incorporate CancellationToken if possible
var CustomerData = query.FirstOrDefault().CustomerData;
var result = _mapper.Map<CustomerProfileDto>(CustomerData);
var clientaddress = query.FirstOrDefault().Creditorconfig.Clientaddresses.ToList();
if (clientaddress.Any())
{
var addressDetails = new IPAdressDetails { Currentaddress = request.address, Clientaddresses = clientaddress };
result.IsIPWhitelisted = _addressValidator.IsAddressWhitelisted(addressDetails);
}
return result;
}
//whats the best alternative of sending null here?
return null;
}
【问题讨论】:
-
返回
null没问题,但你应该缓存query.FirstOrDefault()并检查它是否为空,而不是调用.Any() -
询问最佳实践的问题是基于意见的,因此在这里偏离主题。见meta.stackoverflow.com/q/296542/62576。请改写您的问题。
-
query.Any(),query.FirstOrDefault(),query.FirstOrDefault(): 你确定你不是连续向数据库发出三个请求吗?这不仅效率低下,而且还可能从每个请求中获得不同的结果,从而使Handle方法的逻辑(可能不恰当地命名)无效。
标签: c# async-await task webapi clean-architecture