假设我有一个名为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
,但这会生成所有属性。由于速度是一个问题,我试图让事情尽可能轻松。
它不起作用的原因:它不构建。编译时间错误。我得到的两个错误是:
无法将类型''隐式转换为...
和
CS0746无效的匿名类型成员声明符。必须使用成员分配,简单名称或成员访问声明匿名类型成员。
答案 0 :(得分:1)
首先,将实体关系定义为strInp = .Replace(strInp, vbLf)
,例如
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
答案 1 :(得分:0)
试试这个,
var result = db.Threads.Include(thread => thread.Comments);
希望有所帮助,