C# 实体框架仅包括/选择不同表中的某些属性
假设我有一个名为C# 实体框架仅包括/选择不同表中的某些属性,c#,entity-framework,entity-framework-core,dbcontext,C#,Entity Framework,Entity Framework Core,Dbcontext,假设我有一个名为GetThreadWithComments()的方法。每个线程有一个用户(创建者)和一个注释列表。每个评论有一个用户(海报) 以下是类(由EF生成): 上述方法不起作用。然而,我不太确定如何正确地做到这一点。我可以使用include,但这将生成所有属性。由于速度是一个问题,我正试图让事情尽可能轻 它不起作用的原因:它无法构建。编译时错误。我得到的两个错误是: 无法将类型“”隐式转换为 及 CS0746无效的匿名类型成员声明符。匿名类型成员必须使用成员分配、简单名称或成员访问权限声
GetThreadWithComments()
的方法。每个线程有一个用户(创建者)和一个注释列表。每个评论有一个用户(海报)
以下是类(由EF生成):
上述方法不起作用。然而,我不太确定如何正确地做到这一点。我可以使用include
,但这将生成所有属性。由于速度是一个问题,我正试图让事情尽可能轻
它不起作用的原因:它无法构建。编译时错误。我得到的两个错误是:
无法将类型“”隐式转换为
及
CS0746无效的匿名类型成员声明符。匿名类型成员必须使用成员分配、简单名称或成员访问权限声明
试试这个
var result = db.Threads.Include(thread => thread.Comments);
希望有帮助,首先,将实体关系定义为
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 }
})
});
为什么上述方法不起作用?有什么错误吗?据我所知,实体关系必须声明为
virtual
,因此public User{get;set;}
应该是public virtual User{get;set;}
对吗?如果您不纠正此注释上述操作不起作用。
im向下投票并标记关闭。为什么它不工作,你们的电脑关机了吗,你们的狗吃了吗,是不是产生了一个奇点?我想问题很清楚@ViRuSTriNiTyI将很快编辑我的答案lol.更新。我注意到投了反对票,国旗即将关闭。你能不能冷静下来,我离开了几分钟@MichaelRandall@FerX32撤销了他写的我可以用include,但是是对的。Include将生成注释的所有属性。我只想要很少的财产。例如,CommentID和消息。在您选择之前,它不会加载@ViRuSTriNiTyIt构建后,编译错误消失了。明天凌晨3点,我要测试一下。非常感谢你迄今为止的帮助。
public virtual User User { get; set; }
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 }
})
});