代码之家  ›  专栏  ›  技术社区  ›  FerX32

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

  •  2
  • FerX32  · 技术社区  · 7 年前

    假设我有一个名为 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 回复  |  直到 7 年前
        1
  •  1
  •   ViRuSTriNiTy    7 年前

    首先,将实体关系定义为 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 }
        })
    });
    
        2
  •  0
  •   Berkay Yaylacı    7 年前

    试试这个,

    var result = db.Threads.Include(thread => thread.Comments);
    

    希望有帮助,