我有子实体,想要包含父字段。查询很简单
var item = db.Events
.Where(e => e.Id == eventId)
.Include(e => e.EventItems)
.Include(e => e.ParentObject)
.SingleOrDefault();
但是,我不想将整个ParentObject与其复杂的子项一起加载,而只需要其中一个字段。我应该怎么做,我是否需要将该字段添加到子实体(现在我有整个父母)
public class EventBase
{
public int Id { get; set; }
[ForeignKey("ParentObject")]
public int ParentId { get; set; }
public Parent Parent { get; set; }
}
答案 0 :(得分:3)
数据库查询的一个较慢部分是将数据从数据库传输到本地进程。因此,不选择任何不打算使用的属性是非常明智的。
因此,每当您看到“包括”时,请重新考虑您的陈述。包含不是您选择的最佳方式,因为它传输的数据比实际使用的数据多。
例如考虑教师和学生。教师有一个主键,该教师的每个学生都有一个外键,其值等于教师的主键。
如果您使用Include
来获取教师及其学生,那么所有外键都将转移到本地内存,这非常浪费,因为您知道它们都等于教师的主键。
回到你的问题
因此,您需要使用eventId的one-only-only事件的某些属性,您还需要此事件的parentObject的某些属性,并且您需要其所有EventItem的(某些)属性。
轻松!使用选择,并确保您只选择您真正计划使用的属性
var result = db.Events // from all events
.Where(event => event.Id == eventId) // take only the ones with Id == eventId
.Select(event => new // from every remaining event,
{ // select the following properties:
// select only the properties you plan to use, for instance:
Name = event.Name,
Description = event.Description,
// from the one and only parent, select the properties you plan to use
Parent = new
{
Name = event.ParentObject.Name,
Security = event.ParentObject.Security,
},
EventItems = event.EventItems
.Where(eventItem => eventItem.Severity > high)
.Select(eventItem => new
{
// again: only the properties you use!
})
.ToList(),
})
.SingleOrDefault();
答案 1 :(得分:1)
使用Select()和匿名类型。见https://gist.github.com/danielcondemarin/e7af16f59e062977bded3252140a46d4
var item = db.Events
.Where(e => e.Id == eventId)
.Include(e => e.EventItems)
.Select(e => new {Event=e, ParentDesc=e.Parent.Desc})
.SingleOrDefault();