ArgumentException get только при выполнении asyn c вызова базы данных в c# с использованием linq QueryableExpression - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть следующее QueryableExpression

Выражение :

public static IQueryable<IView> View(IQueryable<IView> dbSet)
{
    var result = dbSet
        .Include(vw => vw.Site);

    return result;
}

Я вызываю это так, и это работает:

var demo = SitesExpressions.View(_db.GetWorker<View>().DbSet).Single(v => v.Id == 1);

Но при этом асинхронный:

var error = await SitesExpressions.View(_db.GetWorker<Vie`w>().DbSet).SingleAsync(kf => kf.Id == 1);

Я получаю

ArgumentException: выражение типа 'System.Threading.Tasks.Task 1[LC.Assets.Components.Data.Models.Sites.View]' cannot be used for return type 'System.Threading.Tasks.Task 1 [L C .Assets. Components.Data.Models.Sites.IView] '

Я знаю, что могу изменить выражение на

IQueryable<View>

, но мне интересно, почему это происходит.

IView, просмотр :

public interface IView
{
    int SiteId { get; set; }
    string Ref { get; set; }
    Site Site { get; set; }
    IEnumerable<MetaEntry> MetaEntries { get; set; }
    string Group { get; set; }
    string Name { get; set; }
}

public class View : IView
{
    public int SiteId { get; set; }
    public string Ref { get; set; }
    public Site Site { get; set; }
    public virtual IEnumerable<MetaEntry> MetaEntries { get; set; }
    public string Group { get; set; }
    public string Name { get; set; }
}

1 Ответ

0 голосов
/ 20 апреля 2020

Закончено этим решением

public async Task<IEnumerable<TType>> View<TType, TImplementation>(Expression<Func<TImplementation, bool>> predicate)   where TType : IView
                                                                                                                        where TImplementation : View
{
    var result = await this.DBContext.GetWorker<TImplementation>().DbSet
        .Include(vw => vw.Site)
            .ThenInclude(st => st.App)
                .ThenInclude(ap => ap.Client)
        .Include(vw => vw.Site)
            .ThenInclude(st => st.CORSEntries)
        .Include(vw => vw.Site)
            .ThenInclude(st => st.MetaEntries)
        .Where(predicate).ToListAsync();

    return (IEnumerable<TType>)result;
}

Вызов:

var test = await ex.View<IView, View>(vw => vw.Id == 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...