2013-03-08 3 views
2

J'utilise Entity Framework et SQL Server 2008 avec l'approche Database First.Récupérer seulement quelques colonnes en utilisant un ORM

Mon problème est:

j'ai quelques tables qui tient beaucoup de colonnes (~ 100), et lorsque je tente de récupérer beaucoup de lignes il faut un temps considérable avant de retourner les résultats, même si parfois Je dois utiliser seulement 3 ou 4 colonnes de cette table.

je passé une demi-journée en Stackoverflow essayant de trouver un moyen de résoudre ce problème, et je suis venu avec deux solutions:

  • L'utilisation des procédures stockées pour récupérer des données avec les colonnes que je veux.
  • Modifiez les fichiers .edmx (xml) et .cs pour supprimer les colonnes que je n'utiliserai pas.

à nouveau Mon problème est:

  • Si j'utilise des procédures stockées pour récupérer les données avec les colonnes que je veux, Entity Framework lâche, il bénéficie et je peux utiliser ADO.NET au lieu de et appelez directement les procédures stockées ...

  • Je ne peux pas prendre la deuxième solution, parce que chaque fois que je fais un changement dans la base de données, je suis obligé de régénérer le fichier .edmx et je perds les modifications que j'ai faites avant: '(

Existe-t-il un moyen de le faire d'une manière ou d'une autre dans Entity Framework? Est-ce possible!

Je sais que d'autres ORM existent comme NHibernate ou Dapper, mais je ne sais pas s'ils peuvent offrir cette fonctionnalité sans causer beaucoup de douleur.

+5

Avez-vous essayé d'utiliser le mot-clé 'select' en vous l'expression LINQ? –

+0

Pourquoi ne sélectionnez-vous pas simplement les colonnes spécifiques? –

+0

Essayez-vous de manipuler des objets d'entité avec la plupart des colonnes étant chargées paresseux? C'est possible avec NHibernate – jbl

Répondre

0

Vous pouvez créer un deuxième projet avec un DbContext, des POCO et des cartes qui renvoient le sous-ensemble de colonnes dont vous avez besoin.

Ceci est un cas de code couper-coller, mais il vous obtiendra ce dont vous avez besoin.

Vous pouvez simplement créer des classes et projeter les données dedans mais je ne suis pas sûr que vous pouvez faire des mises à jour en utilisant cette méthode. Vous pouvez utiliser des types anonymes dans une même méthode, mais vous aurez besoin de classes réelles pour passer d'une méthode à l'autre.

Une autre option serait de passer à un premier développement de code.

+0

Actuellement, les données sont un DataContract (WCF), donc en gros, en lecture/écriture. –

+0

@Schneider avez-vous besoin que les sous-ensembles de données de colonne soient accessibles en écriture? – qujck

+0

Oui, et je veux être en mesure de sérialiser seulement quelques colonnes afin que je puisse contrôler le flux de données qui circule sur le réseau. –

6

Vous n'avez pas à retourner chaque colonne à chaque fois. Vous pouvez spécifier les colonnes dont vous avez besoin.

var query = from t in db.Table 
      select new { t.Column1, t.Column2, t.Column3 }; 
1

Normalement, si vous projetez les données dans un autre poco il le fera automatiquement dans EF/etc L2S:

var slim = from row in db.Customers 
      select new CustomerViewModel { 
      Name = row.Name, Id = row.Id }; 

j'attendre à ce que seulement lire 2 colonnes.

Pour des outils comme pimpant: depuis que vous contrôlez SQL, spécifiez uniquement les colonnes que vous voulez - ne pas utiliser *

+0

Je peux prendre cette solution, mais si je dois faire quelques changements (ce qui est le cas) et les enregistrer dans la base de données? –

+0

@Schneider oui, ça craint; la plupart des ORM vont vouloir un objet complet pour cela. Options: 1: payer le prix de cela; 2: assurez-vous que toutes les «grandes» colonnes sont paresseuses, vous pouvez donc en payer le prix * réduit *; 3: refactoriser les données en plusieurs tables, de sorte que vous pouvez mettre à jour le "core" à moindre coût; 4: faire les mises à jour via SQL brut –

Questions connexes