在EF Select扩展中使用方法的任何方式?

时间:2020-03-29 21:37:59

标签: c# linq entity-framework-core

我有一个返回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?

1 个答案:

答案 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连接字符串中。

相关问题