Есть ли способ использовать метод в расширении EF Select? - PullRequest
0 голосов
/ 30 марта 2020

У меня есть метод, который возвращает ViewModel asyn c:

    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
            });
    }

и хочу использовать его как выражение выбора, например:

    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?)

Можно ли предотвратить повторную установку ViewModel внутри расширения Select?

1 Ответ

0 голосов
/ 30 марта 2020

Большое спасибо @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 в строку подключения DBContext, найденную здесь Как включить MultipleActiveResultSets .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...