我有这种情况:例如,我有这样的类:
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的例子(
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 Administrator
或is 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”);