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

本文关键字:继承 EF Linq 搜索 使用 | 更新日期: 2023-09-27 17:54:28

我有这种情况:例如,我有这样的类:

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查询来搜索所有满足以下条件的用户:

  • Name="zzz">
  • SpecificAdministratorAttribute="xxx">

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

如果我有一个属性只存在于其中一个子类中,但我需要从USERS(Parent(中搜索它,而不知道子类是什么,该怎么办?假设您需要获得符合SpecificOtherClassAttribute="uuu"的所有USERS?有什么方法可以从用户而不是从OTHERCLASS(儿童(搜索这个吗?(我需要一个使用Linq的例子(

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

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");

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

一个是,正如Walter提到的,为Admin创建一个基类并从中继承。然后你可以检查用户是否是Admin,如果是,则获得适当的属性。

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

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

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

这两种方法有相同的问题:执行时间。问题是数据库不能生成像is Administratoris IAdministrator这样的东西。因此,您将检索所有用户,然后将他们单独转换为所需的类型,以查看他们是否对应于该类型。

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

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