将动态导航属性列表传递给我的存储库类以用作.Include

时间:2015-02-02 22:45:15

标签: 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);
}

,其名称如下: -

var staff = await staffRepository.FindStaff(id);

但我的问题是,如果我可以使我的repo方法更通用,并将一个导航属性列表(零或更多)传递给.Include()?

1 个答案:

答案 0 :(得分:0)

在这里你可以有两种方法来实现。

  1. Include(string path)方法,它接受RyanCJI评论中提到的字符串参数。
  2. 使用Include(Func<T1, T2> fn)委托人的Func<T1, T2>
  3. 以下是两者的外观。

    <强> 1。溶液

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

    <强> 2。溶液

    public async Task<T2> FindSkill<T1>(int id, Func<T1,T2> fn)
    {
        return await context.Set<T1>.Include(fn).SingleOrDefaultAsync(a => a.SkillID == id);
    }
    

    然后这样称呼它。

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

    坦率地说,我不确定第二个解决方案,因为我没有尝试使用DbContext,但我只是想指出你可以朝这个方向实现这个目标。即通过传递Func Generic代表。