C# 将动态导航属性列表传递到我的存储库类以用作。包括

C# 将动态导航属性列表传递到我的存储库类以用作。包括,c#,entity-framework,generics,entity-framework-6,C#,Entity Framework,Generics,Entity Framework 6,我有以下存储库方法:- public async Task<Skill> FindSkill(int id) { return await context.Skills.Include(a=>a.History)SingleOrDefaultAsync(a => a.SkillID == id); } 但我的问题是,我是否可以使我的repo方法更通用,并向它传递一个导航属性列表(零或更多),以便在.Include()中使用?这里有两种实现方法 Include(字

我有以下存储库方法:-

public async Task<Skill> FindSkill(int id)
{
    return await context.Skills.Include(a=>a.History)SingleOrDefaultAsync(a => a.SkillID == id);
}

但我的问题是,我是否可以使我的repo方法更通用,并向它传递一个导航属性列表(零或更多),以便在.Include()中使用?

这里有两种实现方法

  • Include(字符串路径)
    方法,该方法采用RyanCJI在注释中提到的字符串参数
  • 使用接受委托的
    Include(Func fn)
  • 下面是他们两人的样子

    1。解决方案

    public async Task<Skill> FindSkill(int id, string path)
     {
          return await context.Skills.Include(path).SingleOrDefaultAsync(a => a.SkillID == id);
     }
    
    public async Task<T2> FindSkill<T1>(int id, Func<T1,T2> fn)
    {
        return await context.Set<T1>.Include(fn).SingleOrDefaultAsync(a => a.SkillID == id);
    }
    
    公共异步任务FindSkill(int-id,字符串路径)
    {
    返回wait context.Skills.Include(path).SingleOrDefaultAsync(a=>a.SkillID==id);
    }
    
    2。解决方案

    public async Task<Skill> FindSkill(int id, string path)
     {
          return await context.Skills.Include(path).SingleOrDefaultAsync(a => a.SkillID == id);
     }
    
    public async Task<T2> FindSkill<T1>(int id, Func<T1,T2> fn)
    {
        return await context.Set<T1>.Include(fn).SingleOrDefaultAsync(a => a.SkillID == id);
    }
    
    公共异步任务FindSkill(int-id,Func-fn)
    {
    返回wait context.Set.Include(fn.SingleOrDefaultAsync(a=>a.SkillID==id);
    }
    
    然后像这样称呼它

    Task<Skill> tsk =  staffRepository.FindSkill<History>(id, d => d.History)
    
    Task tsk=staffRepository.FindSkill(id,d=>d.History)
    

    坦率地说,我不确定第二种解决方案,因为我没有用
    DbContext
    尝试过,但我只想指出,您可能会朝着这个方向实现这一点。i、 e.通过传递Func Generic delegate。

    查看msdn文档…请参阅“定义查询路径以形成查询结果”一节