J'utilise la bibliothèque/échantillon Dynamic Linq de Microsoft pour faire une commande sur une liste. Ainsi, par exemple, j'ai le code C#:Exception de référence nulle dans une expression LINQ dynamique
myGrid.DataSource=repository.GetWidgetList()
.OrderBy(sortField + " " + sortDirection).ToList();
j'ai un cas où mon objet a un 0: 1 relation avec un autre objet, qui a une propriété qui pourrait être affiché dans la grille. Quand nous essayons de trier ça, ça fonctionne bien tant que tous mes Widgets ont cet enfant. Nous commandons par Child.Name
par exemple. Lorsque Child est null, cependant, nous obtenons l'exception de référence nulle.
J'ai quelques options ici que je sais que je pourrais choisir dans un type anonyme et lier à cela, je pourrais également exposer le Child.Name sur l'objet parent et manipuler ceci par l'intermédiaire du code (que je n'aime pas modèle d'objet pour cela).
Dans un monde idéal, je voudrais mettre à jour la bibliothèque pour gérer ce cas. Avant de m'y plonger, je me demande si quelqu'un a déjà traversé ça ou pas et a déjà une solution?
Modifier
On dirait que je n'ai pas expliqué assez bien. J'utilise le Dynamic Linq Library qui vient avec le C# samples. Cette bibliothèque ajoute quelques belles extensions qui vous permettent d'utiliser une chaîne INPLACE d'une expression lambda donc mon code est en fait quelque chose comme ceci:
private void BindGrid(sortField,sortDirection)
{
this.grid.DataSource=....OrderBy("MyField ASC")....
}
Bien sûr, la chaîne, il est remplacé par les paramètres. Mais cela nous permet de changer le tri dynamiquement lorsque l'utilisateur clique sur un en-tête de grille. Nous n'avons pas d'autre logique pour gérer toutes les permutations.
Ma solution que j'ai décrit ci-dessous change ma belle méthode propre dans:
private void BindGrid()
{
var sortField=this._sortField;
if (sortField=="Child.Name")
{
sortField="iif(Child==null,null,Child.Name)";
}
this.grid.DataSource=repository.GetWidgetList()
.OrderBy(sortField + " " + this._sortDirection)
.ToList();
}
Et tout cela fonctionne, cela signifie maintenant que je dois mettre à jour ce code que nous ajoutons de nouveaux champs ou des propriétés que nous voulons exposer dans la grille qui sont sur un objet enfant.
Non, ce n'est pas ce dont je parle. Le linq dynamique fait partie de l'exemple de code C# et vous permet d'utiliser une chaîne en tant que OrderBy par exemple. Il compile la chaîne à une expression lambda lors de l'exécution. – JoshBerke
Pourquoi cette réponse a-t-elle été acceptée comme réponse? Je suis dans la même situation. – Mike