如何在 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();
 }
}