【问题标题】:Entityframework Load certain columns of a list withing a entity实体框架加载实体内列表的某些列
【发布时间】:2016-07-28 17:24:48
【问题描述】:

嘿,假设我们有一个老师和一个学生关系,老师负责一组学生。现在假设我想加载老师的所有信息,给定他或她的 id,包括该老师负责的学生,但是从这些学生中我只想加载包含名称的列,而不是年龄和学生编号(见下文)。现在我的问题是,我该怎么做?

在尝试解决这个问题时,我发现了这个https://colinmackay.scot/2011/07/31/getting-just-the-columns-you-want-from-entity-framework/,这与我的情况几乎相似,但是链接中显示的示例将返回一个字符串列表,我希望在其中返回老师。

类:

public class SchoolContext : DbContext
{
    public DbSet<Teacher> Teachers { get { return Set<Teacher>(); } }
}


public class Teacher
{
    [Key]
    public int ID { get; private set; }
    public string Name { get; set; }
    public List<Students> Students { get; set; }
}



public class Students
{
    [Key]
    public int DatabaseID { get; private set; }
    public int StudentNumber { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

加载示例:

    private static void Main(string[] args)
    {
        var Teacher = LoadTeacher(4);
        foreach(var student in Teacher.Students)
        {
           Console.WriteLine(student.Name);
        }
    }


    public static Teacher LoadTeacher(int teacherID)
    {
        using (var context = new SchoolContext())
        {
            return context.Teachers.Where(t => t.ID == teacherID)
                                   .FirstOrDefault();
                                   //At this part is my question, how would i make sure that only the name of those students are loaded and not the Age and the StudentNumber? 

        }
    }

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    您必须在您的上下文中选择您想要返回的内容。 并将 this 作为匿名对象返回

    像这样:

    public static IQueryable LoadTeacher(int teacherID)
    {
        using (var context = new SchoolContext())
        {
            var retVal = from teacher in context.Teachers
                         where teacher.ID == teacherID
                         select new {
                               Teacher = teacher,
                               StudentNames = from student in teacher.Students
                                              select student.Name
                               }
             return retVal;
        }
    }
    

    然后你可以从你的调用方法访问这个对象。

    【讨论】:

    • 不推荐返回匿名类类型。明确定义的传输类型的定义会更好。
    • 在我看来,这取决于你想对结果做什么。如果您只想在 Web 应用程序的表格中显示它,将其放在 Json 对象中通常很有用,因此您不需要为结果定义类,因此您的项目不会变得越来越大每个查询
    • 这似乎是迄今为止最好的解决方案。
    【解决方案2】:

    使用Select 可能是:

    将序列的每个元素投影到一个新的形式中。

    public static Teacher LoadTeacher(int teacherID)
    {
        using (var context = new SchoolContext())
        {
            return context.Teachers.Where(t => t.ID == teacherID)
                                    .Select(t => new Teacher() { Name = t.Name })
                                    .FirstOrDefault();
        }
    }
    

    【讨论】:

    • @msanz 不,提供程序只选择查询中使用的列。
    【解决方案3】:

    您可以使用 lambda 查询获得这样的学生姓名

    teachers.First(t => t.ID == 10).Students.SelectMany(s=> s.Name)
    

    编辑

    如果您还需要教师对象

    teachers.Where(t => t.ID == 10).Select(t=>new {teacher= t,studenNames =t.Students.SelectMany(s => s.Name) }).First()
    

    【讨论】:

    • 如果您只需要名称,这确实是一个很好的解决方案,但是在我的情况下,我更喜欢从同一个查询中获取教师对象。
    • 是的,这就是我要寻找的地方:P(它与@Yggras 提供的解决方案相同,我假设您没有看到它)
    • 我没看到。 :D 但无论如何,我更喜欢 Lambda 而不是 linq。这更容易理解
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多