asp.net通用存储库按属性查找

时间:2015-10-29 14:31:58

标签: c# asp.net linq repository-pattern

我在ASP.NET中使用Generic Repositories。现在我试图通过用户Id找到一个对象,它需要访问类的属性,但是在linq表达式中,属性是不知道的,因为它还不知道类型。有没有办法解决这个问题?

public virtual IEnumerable<T> GetByUser(string userId)
    {
        if (typeof(T).GetProperty("Employee") != null)
        {
            return Db.Set<T>().Where(x => x.Employee.Id == userId);
        }
        return new List<T>();
    }

“x.Employee.Id”收到没有Employee定义的错误。这是可以预料的。我是否需要以完全不同的方式执行此操作,或者有人知道如何解决此问题吗?

我希望有人可以提供帮助!

1 个答案:

答案 0 :(得分:1)

使用界面,以便您知道T将具有某些属性。或者使用基类型,然后对泛型参数使用约束。

public virtual IEnumerable<T> GetByUser(string userId) where T : IEmployee
{
   return Db.Set<T>().Where(x => x.Employee.Id == userId);
}

IEmployee看起来像这样

public interface IEmployee 
{
    Employee Employee { get; set; }
}

显然这有点粗糙,但根据你的实体,这可能是一种方法。您可以始终映射所有内容,然后为共享属性等构建接口。

但是老实说,我认为您最好的方法是拥有一套功能更强大的通用存储库。例如,基础仓库,然后知道EmployeeRepostiory将成为员工的T

<强> MSDN Article on Constraints