繁体   English   中英

通用 LINQ 函数抛出“未将对象引用设置到对象的实例”。 但数据库集<T>和 DbContext 被初始化

[英]Generic LINQ Function throws "Object reference not set to an instance of an object." but DbSet<T> and DbContext are initialized

我正在尝试使用通用函数查询DbSet<T>但任何尝试都会抛出“未将对象引用设置为对象的实例”。 错误但是当我使用 DbContext 实例时,它可以工作。 我可以知道我做错了什么,我已经正确连接了其他所有东西。

public abstract class GenericRepository<T> : IGenericRepository<T> where T : class
{
        private readonly DbSet<T> dbSet;

         private readonly AppDbContext context;

         public GenericRepository(AppDbContext _context)
         {
            context = _context;

            dbSet = context.Set<T>();
         }

        //Function throwing Error

        public Task<List<T>> GetListAsync(
            Expression<Func<T, bool>> predicate = null,
            Func<IQueryable<T>, IIncludableQueryable<T, object>> include = null,
            Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
            Expression<Func<T, object>> distinctBy = null)
        {
            IQueryable<T> query = dbSet;

            if (predicate != null)
            {
                query = query.Where(predicate);
            }

            if (distinctBy != null)
            {
                query = query.Distinct(distinctBy);
            }

            if (include != null)
            {
                query = include(query);
            }

            if (orderBy != null)
            {
                return orderBy(query).ToListAsync();
            }

            return query.ToListAsync();
        }

}

下面是使用泛型函数的代码

public class EmployeeAssetServiceRepository : GenericRepository<EmployeeAssetService>, IEmployeeAssetServiceRepository
{
        private ResponseHelper Response;

        private ResultCode ResultCode { get; set; }

        private ResponseMessage Message { get; set; }

        private readonly AppDbContext context;

        public EmployeeAssetServiceRepository(AppDbContext _context) : base(_context)
        {
            context = _context;

            Response = new ResponseHelper();

             Message = new ResponseMessage();
        }

        public async Task<ResponseHelper> GetAllAsync()
        {
            List<EmployeeAssetService> recordList = new List<EmployeeAssetService>();

            try
            {
                recordList = await GetListAsync(
                    predicate: null,
                    include: e => e.Include(i => i.Assignment.Employee)
                    .Include(i => i.Assignment.Employee.Title)
                    .Include(i => i.Assignment.Employee.Department),
                    orderBy: e => e.OrderBy(o => o.Assignment.Employee.LastName)
                    .ThenBy(o => o.Assignment.Employee.FirstName),
                    distinctBy: e => e.Assignment.Employee.Id);

                 /*context.EmployeeAssetService
                    .Include(i => i.Assignment.Employee)
                    .Include(i => i.Assignment.Employee.Title)
                    .Include(i => i.Assignment.Employee.Department)
                    .Distinct(d => d.Assignment.Employee.Id)
                    .OrderBy(o => o.Assignment.Employee.LastName)
                    .ThenBy(o => o.Assignment.Employee.FirstName)
                    .ToListAsync();*/

                Message.Success = string.Format(EnumDescription
                        .GetEnumDescription(ResultCode.ReadAllMessage),
                        nameof(EmployeeAssetService).InsertSpace());

                ResultCode = ResultCode.Success;
            }
            catch (Exception e)
            {
                return ResponseHelper.ExceptionResponse(nameof(EmployeeAssetServiceRepository), nameof(Employee            AssetServiceRepository.GetAllAsync), e);
            }

            return ResponseHelper.CreateResponse(ResultCode, Message, recordList);
        }

}

显然,正如@JanneMatikainen 指出的那样,我的执行顺序是错误的,我已将 include 命令移到谓词下方,现在可以使用了。

public Task<List<T>> GetListAsync(
        Expression<Func<T, bool>> predicate = null,
        Func<IQueryable<T>, IIncludableQueryable<T, object>> include = null,
        Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
        Expression<Func<T, object>> distinctBy = null)
    {
        IQueryable<T> query = dbSet;

        if (predicate != null)
        {
            query = query.Where(predicate);
        }

        if (include != null)
        {
            query = include(query);
        }

        if (distinctBy != null)
        {
            query = query.Distinct(distinctBy);
        }

        if (orderBy != null)
        {
            return orderBy(query).ToListAsync();
        }

        return query.ToListAsync();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM