Entity Framework 6 在执行 where 子句时强制转换继承对象
Entity Framework 6 cast inheritance object when doing where clause
假设我有评论 table,
管理员和会员可以对其发表评论。
Admin 和 Member 继承自 User,
所以现在我想通过成员 (groupName)
的特定属性获得评论和过滤
public class User
{
[Key]
public int id { get; set; }
public string name { get; set; }
public string type { get; set; } //member or admin
}
public class Admin : User
{
public string someProp { get; set; }
}
public class Member : User
{
public string groupName { get; set; }
}
public class Comment
{
[Key]
public int id { get; set; }
public string msg { get; set; }
[ForeignKey("user")]
public int user_id { get; set; }
public virtual User user { get; set; }
}
var comments = db.comments.Where(c => c.user.type == "member" && c.user.groupName == "abc").ToList();
当然上面的代码不能工作,
所以对我有什么想法吗?
试试这个:
var comments = db.comments.Where(c =>
c.user is Member &&
(c.user as Member).groupName == "abc"
);
此外,如果您公开关联的另一端(用户 -> 评论),可能会容易得多:
public abstract class User
{
[Key]
public int id { get; set; }
public string name { get; set; }
public string type { get; set; } //member or admin
public virtual ICollection<Comment> Comments { get; set; }
}
然后:
var comments = db.users
.OfType<Member>()
.Where(x => x.groupName == "abc")
.SelectMany(x => x.Comments);
P.S我冒昧把你的User
class标记为abstract
。
假设我有评论 table, 管理员和会员可以对其发表评论。 Admin 和 Member 继承自 User, 所以现在我想通过成员 (groupName)
的特定属性获得评论和过滤public class User
{
[Key]
public int id { get; set; }
public string name { get; set; }
public string type { get; set; } //member or admin
}
public class Admin : User
{
public string someProp { get; set; }
}
public class Member : User
{
public string groupName { get; set; }
}
public class Comment
{
[Key]
public int id { get; set; }
public string msg { get; set; }
[ForeignKey("user")]
public int user_id { get; set; }
public virtual User user { get; set; }
}
var comments = db.comments.Where(c => c.user.type == "member" && c.user.groupName == "abc").ToList();
当然上面的代码不能工作, 所以对我有什么想法吗?
试试这个:
var comments = db.comments.Where(c =>
c.user is Member &&
(c.user as Member).groupName == "abc"
);
此外,如果您公开关联的另一端(用户 -> 评论),可能会容易得多:
public abstract class User
{
[Key]
public int id { get; set; }
public string name { get; set; }
public string type { get; set; } //member or admin
public virtual ICollection<Comment> Comments { get; set; }
}
然后:
var comments = db.users
.OfType<Member>()
.Where(x => x.groupName == "abc")
.SelectMany(x => x.Comments);
P.S我冒昧把你的User
class标记为abstract
。