【问题标题】:Search in all childrens that inherit from a parent using EF / Linq使用 EF / Linq 搜索从父级继承的所有子级
【发布时间】:2016-11-04 09:49:25
【问题描述】:

我有这种情况:比如我有这个类:

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"

如何搜索所有满足此条件的用户(父母)。解决方案之一是将此属性移动到父类并在某些情况下将其保留为空。这种情况的最佳解决方案是什么?

如果我有一个只存在于其中一个子类中的属性,但我需要从用户(父)中搜索它,而不知道子类是什么?假设你需要获取所有满足 SpecificOtherClassAttribute = "uuu" 的USERS?有什么方法可以从用户而不是 OTHERCLASS(儿童)中搜索? (我需要一个使用 Linq 的例子)

【问题讨论】:

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


    【解决方案1】:
    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");
    

    【讨论】:

    • 谢谢,但是如果我有一个只存在于其中一个子类中的属性,但我需要从用户(家长)中搜索它,而不知道孩子的类是什么?假设您需要获取所有满足 SpecificOtherClassAttribute = "uuu" 的 USERS ?有什么方法可以从用户而不是 OTHERCLASS(儿童)搜索这个? (我需要一个使用 Linq 的例子)
    • 用一个例子编辑。
    【解决方案2】:

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

    正如沃尔特所说,一个是为 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”);
    

    【讨论】:

    • 感谢 Ivan 的回答,但我的问题是我不知道要搜索什么类型的孩子。我需要搜索具有特定属性的所有用户(通常)。这个属性不是USERS的一部分,是其中一个children类的一部分。 (可能其中一个孩子没有这个属性,所以只带有这个属性的,如果有,匹配该属性的-只返回共同的数据(USERS)-)。
    猜你喜欢
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    相关资源
    最近更新 更多