使用EF / Linq搜索从父母继承的所有子项

时间:2016-07-01 22:32:12

标签: c# asp.net entity-framework linq asp.net-web-api

我有这种情况:例如,我有这个类:

1)

public abstract class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}

2)

public class Administrator: User
{
    public string SpecificAdministratorAttribute { get; set;}
}

3)

public class OtrherClass: User
{
    public string SpecificOtherClassAttribute { get; set; }
}

4)

public class OtherKindOfAdministrator: User
{
    public string SpecificAdministratorAttribute { get; set; }
}

正如您可以看到属性" SpecificAdministratorAttribute"正在两个班级重复。

现在,我需要创建一个linq查询来搜索满足此条件的所有用户:

  • 姓名=" zzz"
  • SpecificAdministratorAttribute =" xxx"

如何搜索符合此条件的所有USERS(父级)。其中一个解决方案是将此属性移动到父类,并在某些情况下将其保留为null。什么是这种情况的最佳解决方案?

如果我有一个属性只出现在其中一个子类中,但是我需要从USERS(Parent)中搜索它,而不知道这些子类是什么?假设您需要获得符合SpecificOtherClassAttribute =" uuu"的所有USERS。 ?有没有办法从USERS而不是OTHERCLASS(儿童)搜索这个? (我需要一个使用Linq的例子)

2 个答案:

答案 0 :(得分:2)

public class Admin: User
{
    public string AdminAttribute { get; set; }
}

public class AdministratorTypeA: Admin
{

}

public class AdministratorTypeB: Admin
{

}

像这样查询:

users.Where(u=> u is Admin && u.Name= "zzz" && (u as Admin).AdminAttribute=="xxx");

答案 1 :(得分:0)

有几种方法可以解决这个问题。

正如沃尔特所提到的,一个是为Admin创建一个基类并从中继承。然后,您可以检查用户是否是管理员,如果是,则获取适当的属性。

另一个是添加一个接口,这样你就不必更改任何类(只需从接口添加继承到每个类):

public interface IAdministrator 
{
    string SpecificAdministratorAttribute { get; set;}
}

public class OtherKindOfAdministrator: User, IAdministrator

然后,您可以使用LINQ检查您的对象是否为IAdministrator。

这两种方法存在同样的问题:执行时间。问题是数据库无法生成is Administratoris IAdministrator之类的内容。因此,您将检索所有用户,然后将其单独投射到所需类型,以查看它们是否与之对应。

对此的解决方案是向名为User(或IsAdmin UserType属性的bool类添加属性,如果您只有管理员而不是管理员,那么您可以轻松确定谁是管理员,谁不是。那么您将能够从数据库中检索仅管理员,然后提取您需要的内容:

users.Where(u => u.UserType == UserTypes.Admin).Select(u => u as Administrator).Where(u => u.Name == ”zzz” && u.AdminAttribute == ”xxx”);