假设我有一种叫做的方法GetThreadWithComments()
。每个主题有1个用户(创建者),并具有评论列表。每个评论有1个用户(发布者)。
以下是类(由EF生成):
public class Thread
{
public int ThreadId { get; set; }
public int UserId { get; set; }
public string Message { get; set; }
public List<Comment> Comments { get; set; }
public User User { get; set; }
}
public class Comment
{
public long CommentId { get; set; }
public string Message { get; set; }
public int UserId { get; set; }
public int ThreadId { get; set; }
public User User { get; set; }
}
所以基本上,我想用用户信息加载线程,并用用户信息关联注释。我已经尝试过这样的事情:
db.Threads.Select(x => new
{
x,
x.User = new { x.User.Username, x.User.Email },
x.Comments = x.Comments.Select(c => new
{
c.Message,
c.CommentId,
c.User = new { c.User.Username, c.User.Email }
})
});
上面的方法不起作用。但是,我不太确定如何正确执行此操作。我可以使用include
,但这会生成所有属性。由于速度是一个问题,因此我尝试使事物尽可能轻。
原因不起作用:它无法生成。编译时错误。我得到的2个错误是:
无法将类型“”隐式转换为...
和
CS0746无效的匿名类型成员声明符。必须使用成员分配,简单名称或成员访问来声明匿名类型成员。
首先,将实体关系定义为virtual
,例如
public User User { get; set; }
应该
public virtual User User { get; set; }
其次,如果以后发布了编译器错误,请尝试添加成员名称。
所以代替
x.User = new { x.User.Username, x.User.Email }
使用
x.User = new { Username = x.User.Username, Email = x.User.Email }
那里也太多了x
。更正的示例将是:
db.Threads.Select(x => new
{
x,
User = new { Username = x.User.Username, Email = x.User.Email },
Comments = x.Comments.Select(c => new
{
c.Message,
c.CommentId,
User = new { Username = c.User.Username, Email = c.User.Email }
})
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句