我在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定义的错误。这是可以预料的。我是否需要以完全不同的方式执行此操作,或者有人知道如何解决此问题吗?
我希望有人可以提供帮助!
答案 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 强>