2009-05-14 7 views
2

Si j'utilise framework d'entité avec linq to sql pour l'interroger et que j'ai un objet Person mais que j'ai seulement besoin de deux propriétés de cet objet, ce qui est en mémoire sera load, l'objet entier?Entité - Linq to Sql Ne charge qu'une partie de l'entité

Exemple:

Je suis l'entité personne ayant des propriétés: Nom, âge, adresse, pays, langue ...

Je ne ai besoin d'utiliser le nom de la propriété et l'âge. Je n'ai donc pas besoin de charger l'adresse, le pays et les autres propriétés ... qu'est-ce qui sera en mémoire et quel type de requête sera demandé à SQL?

Si ma requête Linq est:

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

Et plus tard dans le code que j'appelle seulement le nom et la propriété Âge de chaque personne dans la liste.

Répondre

2

Vous pouvez rechercher uniquement les champs dont vous avez besoin.

Comme si,

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

Je l'ai essayé et je reçois la NotSupportedException suivante: "ne peuvent pas être construites Le type d'entité ou complexe 'CompleteKitchenModel.Contact' dans une requête LINQ to Entities." J'ai posté une question ici: http://stackoverflow.com/questions/2011100/loading-partial-entities-with-linq-to-entities – Shimmy

2

Si vous sélectionnez l'objet entier de la personne avec LINQ, puis lorsque vous accédez à cet objet, la personne entière sera chargée en mémoire. Si vous souhaitez sélectionner uniquement des champs spécifiques, vous devez affiner vos critères de sélection. Par exemple:

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

Bien que ce ne soit pas absolument nécessaire, vous pouvez spécifier si vous utilisez l'EF ou Linq2SQL. Cependant, en fonction de celui que vous utilisez actuellement, le SQL pourrait potentiellement être différent. De la requête que vous avez spécifiée, toutes les propriétés liées à une colonne de base de données seront remplies sur l'objet (à condition qu'elles ne soient pas des références d'entité).

Vous pouvez probablement utiliser efficacement le chargement différé sur les autres propriétés, mais ce n'est pas une solution globale et sera probablement contre-productif dans une zone différente de votre application. Dans l'ensemble, je dirais que si l'application doit être extrêmement sensible à la mémoire, il suffit de charger les objets tels qu'ils sont.

Pour charger le nom juste et âge ..

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

Comme alternative, vous pouvez définir Loaded délai true pour toutes les colonnes que vous ne voulez pas charger instantanément.

+0

Pouvez-vous me donner un exemple ou un lien vers cette option s'il vous plaît? – Melursus

1

Chaque colonne d'entité dans le concepteur possède la propriété Delay Loaded. Le définir sur true (la valeur defaut est false) désactive le chargement instantané de la propriété, il ne sera chargé que lorsqu'il est accédé dans le code.

0
public IQueryable<Persons> GetApplicationRoleList() 
    { 
     return DBContext.Persons.AsQueryable(); 
    } 

;)