实体框架6,包括来自父级的字段

时间:2018-02-18 14:41:24

标签: c# entity-framework

我有子实体,想要包含父字段。查询很简单

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; }
}

2 个答案:

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