【问题标题】:Entity - Linq to Sql Only load a part of the entity实体 - Linq to Sql 仅加载实体的一部分
【发布时间】:2010-10-26 07:42:58
【问题描述】:

如果我使用带有 linq to sql 的实体框架来查询它并且我有一个对象 Person 但我只需要该对象的两个属性,那么将加载内存中的什么,整个对象?

例子:

我得到了实体 Person 的属性:姓名、年龄、地址、国家、语言...

我只需要使用属性名称和年龄。所以我不需要加载地址、国家和其他属性......内存中会有什么,SQL 会询问什么类型的查询?

如果我的 Linq 查询是:

public IQueryable<Person> FindAllPersons()
{
    return from person in db.Persons
           select person;
}

稍后在代码中,我只调用列表中每个人的 Name 和 Age 属性。

【问题讨论】:

    标签: c# linq-to-sql entity-framework .net-3.5


    【解决方案1】:
    public IQueryable<Persons> GetApplicationRoleList()
        {
            return DBContext.Persons.AsQueryable();
        }
    

    ;)

    【讨论】:

      【解决方案2】:

      设计器中的每个实体列都有延迟加载属性。将其设置为true(默认值为false)禁用即时加载属性,只有在代码中访问时才会加载。

      【讨论】:

        【解决方案3】:

        作为替代方案,您可以将不想立即加载的所有列的延迟加载设置为 true。

        【讨论】:

        • 你能给我一个例子或该选项的链接吗?
        【解决方案4】:

        虽然这不是绝对必要的,但您可能需要指定您使用的是 EF 还是 Linq2SQL。但是,根据您实际使用的 SQL 可能会有所不同。

        从您指定的查询中,与数据库列相关的所有属性都将填充到对象上(只要它们不是实体引用)。您可能可以有效地在其他属性上使用延迟加载,但这不是一个全面的解决方案,并且可能会在您的应用程序的不同区域中适得其反。总而言之,我会说除非应用程序必须对内存非常敏感,否则只需按原样加载对象即可。

        只加载姓名和年龄..

        var list = db.Persons.Select(person => new Person() { Age = person.Age, Name = person.Name });
        

        【讨论】:

          【解决方案5】:

          如果您使用 LINQ 选择整个 person 对象,那么当您访问该对象时,整个 person 将被加载到内存中。如果您只想选择特定的字段,您应该细化您的选择标准。例如:

          var persons = from p in db.Persons select new { p.Name, p.Age };
          

          【讨论】:

            【解决方案6】:

            您可以只查询您需要的字段。

            这样,

            public IQueryable<Person> FindAllPersons()
            {
                return from person in db.Persons
                       select new Person(){Name = person.Name, Age = person.Age};
            }
            

            【讨论】:

            • 我试过了,我得到以下 NotSupportedException:“无法在 LINQ to Entities 查询中构造实体或复杂类型 'CompleteKitchenModel.Contact'。”我在这里发布了一个问题:stackoverflow.com/questions/2011100/…
            猜你喜欢
            • 2023-03-11
            • 2011-01-01
            • 1970-01-01
            • 2011-03-25
            • 1970-01-01
            • 1970-01-01
            • 2010-09-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多