如何在 EF 核心 5 请求中使用未映射的属性
How to use not mapped properties in EF core 5 request
我需要在代码中的很多地方使用一个条件(前端也是如此)。我在模型中将这种情况保持为 属性。问题是将此 属性 用于 EF 核心请求,因为无法翻译。
简化示例(实际情况更复杂):
public class Job
{
public DateTime? StartTime{get;set;}
public DateTime? EndTime{get;set;}
public bool Enabled{get;set;}
public bool IsRunning
{
get{ return !EndTime.HasValue && Enabled }
}
}
public class Repository
{
public List<Job> GetRunningJobs
{
_context.Jobs.Where(j => j.IsRunning).ToList();
}
}
最好的方法是什么?
谢谢
你的linq查询一定要写好
public class Repository
{
public List<Job> GetRunningJobs()
{
using(AppContext _context = new AppContext())
{
return _context.Jobs.Where(j => j.IsRunning == true && j.EndTime != null )
.ToList();
}
}
}
另一种方法是您可以使用另一个 class 即 JobDto(数据传输对象)
public class JobDto
{
public DateTime? EndTime{get;set;}
public bool Enabled{get;set;}
}
public class Repository
{
public List<JobDto > GetRunningJobs()
{
using(AppContext _context = new AppContext())
{
IQueryable<JobDto> list;
list = from i in appContext.Jobs
where i.IsDeleted == null
&& u.IsRunning == true
&& u.EndTime != null
select new JobDto (){
EndTime= i.EndTime//set other stuff
};
return list.ToList();
}
}
}
感谢大家的帮助。我以这种方式使用了提到的规范模式:
public abstract class Specification<T>
{
public abstract Expression<Func<T, bool>> ToExpression();
public bool IsSatisfiedBy(T entity)
{
Func<T, bool> predicate = ToExpression().Compile();
return predicate(entity);
}
}
public class RunningJobSpecification : Specification<Db.JobSetting>
{
public override Expression<Func<JobSetting, bool>> ToExpression()
{
return job => !EndTime.HasValue && Enabled;
}
}
public class Repository
{
public List<Job> GetRunningJobs
{
_context.Jobs.Where(j => new RunningJobSpecification().ToExpression() ).ToList();
}
}
我需要在代码中的很多地方使用一个条件(前端也是如此)。我在模型中将这种情况保持为 属性。问题是将此 属性 用于 EF 核心请求,因为无法翻译。
简化示例(实际情况更复杂):
public class Job
{
public DateTime? StartTime{get;set;}
public DateTime? EndTime{get;set;}
public bool Enabled{get;set;}
public bool IsRunning
{
get{ return !EndTime.HasValue && Enabled }
}
}
public class Repository
{
public List<Job> GetRunningJobs
{
_context.Jobs.Where(j => j.IsRunning).ToList();
}
}
最好的方法是什么? 谢谢
你的linq查询一定要写好
public class Repository
{
public List<Job> GetRunningJobs()
{
using(AppContext _context = new AppContext())
{
return _context.Jobs.Where(j => j.IsRunning == true && j.EndTime != null )
.ToList();
}
}
}
另一种方法是您可以使用另一个 class 即 JobDto(数据传输对象)
public class JobDto
{
public DateTime? EndTime{get;set;}
public bool Enabled{get;set;}
}
public class Repository
{
public List<JobDto > GetRunningJobs()
{
using(AppContext _context = new AppContext())
{
IQueryable<JobDto> list;
list = from i in appContext.Jobs
where i.IsDeleted == null
&& u.IsRunning == true
&& u.EndTime != null
select new JobDto (){
EndTime= i.EndTime//set other stuff
};
return list.ToList();
}
}
}
感谢大家的帮助。我以这种方式使用了提到的规范模式:
public abstract class Specification<T>
{
public abstract Expression<Func<T, bool>> ToExpression();
public bool IsSatisfiedBy(T entity)
{
Func<T, bool> predicate = ToExpression().Compile();
return predicate(entity);
}
}
public class RunningJobSpecification : Specification<Db.JobSetting>
{
public override Expression<Func<JobSetting, bool>> ToExpression()
{
return job => !EndTime.HasValue && Enabled;
}
}
public class Repository
{
public List<Job> GetRunningJobs
{
_context.Jobs.Where(j => new RunningJobSpecification().ToExpression() ).ToList();
}
}