我有这种情况:例如,我有这个类:
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查询来搜索满足此条件的所有用户:
如何搜索符合此条件的所有USERS(父级)。其中一个解决方案是将此属性移动到父类,并在某些情况下将其保留为null。什么是这种情况的最佳解决方案?
如果我有一个属性只出现在其中一个子类中,但是我需要从USERS(Parent)中搜索它,而不知道这些子类是什么?假设您需要获得符合SpecificOtherClassAttribute =" uuu"的所有USERS。 ?有没有办法从USERS而不是OTHERCLASS(儿童)搜索这个? (我需要一个使用Linq的例子)
答案 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 Administrator
或is 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”);