我有一个返回ViewModel异步的方法:
public async Task<CardUserBindingViewModel> GetCardUserBindingViewModel(int cardId)
{
/// ... creditStatus, remainCreditDays
return await Task.Run(() => new CardUserBindingViewModel
{
Id = card.Id,
SerialNumber = card.SerialNumber,
PurchaseDate = card.PurchaseDate,
Cost = card.Cost,
CreditStatus = creditStatus,
RemainCreditDays = remainCreditDays.ToString(),
Profile = null
});
}
并希望将其用作Select表达式,例如:
public async Task<IEnumerable<CardUserBindingViewModel>> FindByUserId(int userId)
{
return await Task.Run(() =>
{
return _context.Card
.Where(c => c.UserAccountId.Equals(userId))
.AsEnumerable()
.Select(async c => await GetCardUserBindingViewModel(c.Id));
});
}
错误是:
Cannot implicitly convert type
'System.Collections.Generic.IEnumerable<System.Threading.Tasks.Task<API.Models.CardUserBindingViewModel>>' to
'System.Collections.Generic.IEnumerable<API.Models.CardUserBindingViewModel>'. An explicit conversion exists (are you missing a cast?)
是否可以防止在Select扩展名内再次创建ViewModel?
答案 0 :(得分:0)
非常感谢@Sajid和@ pinkfloydx33,该问题已如下解决。
从以下方法中删除了Task.Run():
public async Task<CardUserBindingViewModel> GetCardUserBindingViewModel(Card card)
{
var creditRepository = _service.GetRequiredService<ICreditRepository>();
var remainCreditDays = await creditRepository.GetCreditRemainDaysByCardId(card);
var creditStatus = remainCreditDays > 0 ?
"HasActiveCredit" : "Expired";
return new CardUserBindingViewModel
{
Id = card.Id,
SerialNumber = card.SerialNumber,
PurchaseDate = card.PurchaseDate,
Cost = card.Cost,
CreditStatus = creditStatus,
RemainCreditDays = remainCreditDays.ToString(),
Profile = null
};
}
按如下所示更改FindByUserId()方法:
public async Task<IEnumerable<CardUserBindingViewModel>> FindByUserId(int userId)
{
return _context.Card
.Where(c => c.UserAccountId.Equals(userId))
.AsEnumerable()
.Select(async c => await GetCardUserBindingViewModel(c))
.Select(c => c.Result);
}
最后将MultipleActiveResultSets = true添加到在How to enable MultipleActiveResultSets处找到的DBContext连接字符串中。