![](/img/trans.png)
[英]LINQ to Sql is empty and throws Object reference not set to an instance of an object. error
[英]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.