首页 > 解决方案 > EF 核心 2.2 - 投影作为通用存储库错误的参数

问题描述

我在我的基础存储库中有一个像这样的方法:

public async Task<TEntity> GetByCondition(Expression<Func<TEntity, bool>> predicate, Func<DbSet<TEntity>, IQueryable<TEntity>> baseQuery = null, Expression<Func<TEntity, TEntity>> projection = null)
        {
            IQueryable<TEntity> q = _context.Set<TEntity>();

            if (baseQuery != null)
            {
                q = baseQuery(_context.Set<TEntity>());
            }
        if (projection != null)
        {
            q = q.Select(projection);
        }

        return await q.Where(predicate).FirstOrDefaultAsync();
    }

我尝试这样调用此方法:

Expression<Func<Businesses, bool>> predicate = x => x.Id == id && x.Status == (int)EnumGringo.LU_Status.active;

            IQueryable<Businesses> baseQuery(DbSet<Businesses> x) => x.Include(c => c.BusinessDetails)
                                                                      .Include(c => c.BusinessFacilities).ThenInclude(c => c.Facility)
                                                                      .Include(c => c.BusinessImages);


            Expression<Func<Businesses, Businesses>> projection = x => new Businesses
            {
                BusinessDetails = x.BusinessDetails.Where(bd => bd.Status == (int)EnumGringo.LU_Status.active && bd.LanguageTypeId == (int)EnumGringo.Lu_LanguageTypes.he).ToList(),
                Name = "Name projection"
            };

            Businesses business = await _repository.GetByCondition(predicate, baseQuery, projection);

在这个阶段,我收到如下错误:

1[DAL.Models.BusinessDetails]' cannot be used for parameter of type 'System.Collections.Generic.IEnumerable方法“System.Collections.Generic.List 1[DAL.Models.BusinessDetails] ToList[BusinessDetails](System.Collections.Generic.IEnumerable1[D​​AL.Models.BusinessDetails])”的“System.Collections.Generic.IAsyncEnumerable 1[DAL.Models.BusinessDetails]”类型的表达式

所以我有两个问题:
1)我如何让它工作?
2)如果我发送投影参数或稍后像这样过滤我的实体,有什么区别吗?

Businesses business = await _repository.GetByCondition(predicate, baseQuery);
            business.BusinessDetails = business.BusinessDetails.Where(bd => bd.Status == (int)EnumGringo.LU_Status.active && bd.LanguageTypeId == (int)EnumGringo.Lu_LanguageTypes.he).ToList();

标签: c#asp.net-coreprojectionef-core-2.2

解决方案


问题在这里:

        if (projection != null)
        {
            q = q.Select(projection);
        }

        return await q.Where(predicate).FirstOrDefaultAsync();

尝试先过滤IQuerable然后得到这样的投影:

        q = q.Where(predicate);
        if (projection != null)
        {
            q = q.Select(projection);
        }

        return await q.FirstOrDefaultAsync();

推荐阅读