comment transformer une chaîne de caractères dans une expression linq?
Similaires: Convertir une chaîne de Linq.Expressions ou d'utiliser une chaîne de caractères comme le Sélecteur?
Un analogue de celui-ci: En passant une expression Linq comme une chaîne de caractères?
Une autre question avec la même réponse: Comment créer des dynamiques en fonction lambda expression Linq à partir d'une chaîne en C#?
Raison pour demander quelque chose qui a beaucoup de questions similaires:
La accepté de répondre à ces questions similaires est inacceptable qu'ils font tous référence à une bibliothèque à partir de 4 ans (bien qu'il a été écrit par le code maître Scott Gu) écrit pour un ancien cadre.net 3.5) , et ne fournit pas de tout, mais un lien en tant que réponse.
Il y a un moyen de le faire dans le code sans y compris l'ensemble de la bibliothèque.
Voici un exemple de code pour cette situation:
public static void getDynamic<T>(int startingId) where T : class
{
string classType = typeof(T).ToString();
string classTypeId = classType + "Id";
using (var repo = new Repository<T>())
{
Build<T>(
repo.getList(),
b => b.classTypeId //doesn't compile, this is the heart of the issue
//How can a string be used in this fashion to access a property in b?
)
}
}
public void Build<T>(
List<T> items,
Func<T, int> value) where T : class
{
var Values = new List<Item>();
Values = items.Select(f => new Item()
{
Id = value(f)
}).ToList();
}
public class Item
{
public int Id { get; set; }
}
Noter que ce n'est pas à la recherche à son tour toute une chaîne de caractères dans une expression comme
query = "x => x.id == somevalue";
Mais plutôt essayant seulement d'utiliser la chaîne comme l'accès
query = x => x.STRING;
Func
?La réflexion donnera le type de propriété ou le nom de la propriété dans la classe T, qui est passé en. La classe T est passé en seulement une référence pour type lors de la connexion à une Entité Cadre Référentiel. Une liste de l'ensemble de la Classe T est retourné à partir du référentiel (
repo.getList()
). Comment réflexion aider à y compris les propriétés de la Classe T dans l'expression linq?Votre exemple la faisait ressembler à vous le faites linq-to-objets, dans ce cas, vous pourriez saisir la valeur de la propriété reflectively. Mais depuis que vous travaillez dans un autre contexte, je ne suis pas sûr que ça marcherait. J'ai posté ma tentative ainsi, vous pouvez vérifier
Si vous souhaitez mettre un bounty sur cette question, vous devez le faire, disant que telle ou telle réponse sera bountied est stupide.
Désolé, je ne peux pas afficher une prime pour un autre 2 jours. Si je pouvais, je le ferais. Peut-être que c'est un problème, vous pouvez augmenter sur meta.
OriginalL'auteur Travis J | 2012-07-13
Vous devez vous connecter pour publier un commentaire.
Voici une arborescence d'expression tentative. Je ne sais toujours pas si cela fonctionnerait avec Entity framework, mais je me dis qu'il vaut la peine d'essayer.
L'appeler comme ceci:
Si vous pouvez utiliser une
Expression<Func<T,int>>
en place d'unFunc
, puis il suffit de supprimer l'appel àCompile
(et de changer la signature deMakeGetter
).Modifier:
Dans les commentaires, TravisJ a demandé comment il pouvait l'utiliser comme ceci:
w => "text" + w.classTypeId
Il y a plusieurs façons de le faire, mais pour des raisons de lisibilité, je recommande l'introduction d'une variable locale d'abord, comme ceci:
Le point principal est que la lecture n'est qu'une fonction, et vous pouvez l'utiliser exactement comme vous le feriez normalement. Lire
Func<T,int>
comme ceci:int DoSomething(T instance)
Merci pour les quelques code du travail et par l'exemple. J'ai aussi été en mesure d'obtenir que cela fonctionne. Je n'ai pas modifier la signature, parce qu'il aurait interféré avec plus de linq en bas de la ligne. J'ai une question, qu'aurais-je à faire pour utiliser
MakeGetter
de cette façon:w => "text" + MakeGetter<T>(classTypeId)
? Semblable àw => "text" + w.classTypeId
.voir mon edit
Merci pour le modifier, et de clarification. Bien que j'ai beaucoup lu de la documentation MSDN à l'adresse et partout sur le web, je suis encore à m'habituer aux délégués, Funcs, et des arbres d'Expression. Je l'apprécie.
OriginalL'auteur Paul Phillips
Ici est une extension de la méthode pour vous avec mon code de test (linqPad):
résultats:
Je suppose que, ses œuvres sur un type de mine de travaux sur un objet... 6 une. Je pense que le mien serait plus performent car il n'y a pas de création de modèles nécessaires.
OriginalL'auteur Hogan
Je n'ai pas essayé cela, et ne sais pas si ça marcherait, mais pourriez-vous utiliser quelque chose comme:
b => b.GetType().GetProperty(classTypeId).GetValue(b, null);
OriginalL'auteur Duncan Howe