N’obtenir que des colonnes spécifiques

Puis-je faire en sorte que mes objects EF ne récupèrent que des colonnes spécifiques dans le sql exécuté? Si j’exécute le code ci-dessous pour récupérer des objects, y a-t-il quelque chose que je peux faire pour obtenir uniquement certaines colonnes si nécessaire?

public IEnumerable GetBy(Expression<Func> exp) { return _ctx.CreateQuery(typeof(T).Name).Where(exp); } 

Cela générerait une clause select contenant toutes les colonnes. Mais si j’ai une colonne contenant une grande quantité de données qui ralentit réellement la requête, comment puis-je exclure cette colonne du sql généré?

Si ma table a Id (int), Status (int), Data (blob), comment puis-je faire ma requête

 select Id, Status from TableName 

au lieu de

 select Id, Status, Data from TableName 

De la suggestion ci-dessous, ma méthode est

 public IEnumerable GetBy(Expression<Func> exp, Expression<Func> columns) { return Table.Where(exp).Select(columns); } 

Et je l’appelle comme ça

 mgr.GetBy(f => f.Id  new {n.Id, n.Status}); 

Cependant, je reçois une erreur de compilation:

Impossible de convertir implicitement le type ‘AnonymousType # 1’ en ‘Entities.BatchRequest’

Sûr. La projection fait ceci:

 var q = from r in Context.TableName select new { Id = r.Id, Status = r.Status } 

Voici un exemple concret (évidemment, ma firebase database a des tables différentes de la vôtre). J’ai ajouté mon modèle EF à LINQPad et tapé la requête suivante:

 from at in AddressTypes select new { Id = at.Id, Code = at.Code } 

LINQPad me montre que le SQL généré est:

 SELECT 1 AS [C1], [Extent1].[AddressTypeId] AS [AddressTypeId], [Extent1].[Code] AS [Code] FROM [dbo].[AddressType] AS [Extent1] 

Aucun des autres champs de la table n’est inclus.

Répondre à la question mise à jour

Votre argument columns indique qu’il prend un type T et renvoie le même type. Par conséquent, l’expression que vous transmettez doit être conforme à cela ou vous devez modifier le type de l’argument, à savoir:

 public IEnumerable GetBy(Expression> exp, Expression> columns) { return Table.Where(exp).Select(columns); } 

Maintenant, l’expression peut renvoyer tout type que vous souhaitez utiliser.