【问题标题】:Entity Framework Include/select only certain properties from different tables实体框架仅包括/选择不同表中的某些属性
【发布时间】:2018-07-23 11:06:54
【问题描述】:

假设我有一个名为GetThreadWithComments() 的方法。每个线程有 1 个用户(创建者)并有一个 cmets 列表。每个 cmets 有 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; }
}

所以基本上,我想加载一个包含用户信息的线程,以及与用户信息相关联的 cmets。我尝试过这样的事情:

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 无效的匿名类型成员声明符。必须使用成员分配、简单名称或成员访问来声明匿名类型成员。

【问题讨论】:

  • 为什么上面的不行?有什么错误什么的吗?据我所知,实体关系必须声明为virtual,所以public User User { get; set; } 应该是public virtual User User { get; set; } 对吧?
  • 如果您不纠正此评论 The above does not work. 我会拒绝投票并标记为关闭。为什么它不起作用,您的计算机是否关闭,您的狗吃了它,是否创建了一个奇点?
  • 我认为问题很明确。 @ViRuSTRiNiTy
  • 我会尽快编辑我的答案,哈哈。更新。我注意到了反对票和关闭的标志。你能不能冷静点,我离开了几分钟。 @MichaelRandall
  • @FerX32 已撤销

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


【解决方案1】:

首先,将实体关系定义为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 }
    })
});

【讨论】:

  • 它构建了,编译错误消失了。我明天会测试它,因为这里是凌晨 3 点。非常感谢您迄今为止的帮助。
【解决方案2】:

试试这个,

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

希望有帮助,

【讨论】:

  • 他不是写了I could use include, but ...吗?
  • 没错。 Include 将生成 Comments 的所有属性。我只想要几个属性。例如。评论 ID 和消息。
  • 在您选择之前不会加载。 @ViRuSTRiNiTy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 2017-03-02
  • 2012-06-05
  • 1970-01-01
相关资源
最近更新 更多