实体框架仅包含/选择不同表中的某些属性

时间:2018-02-13 06:28:49

标签: c# entity-framework entity-framework-core dbcontext

假设我有一个名为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无效的匿名类型成员声明符。必须使用成员分配,简单名称或成员访问声明匿名类型成员。

2 个答案:

答案 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);

希望有所帮助,