Revit C# : LINQ

La technologie LINQ permet créer des requêtes qui s’inspirent du SQL dans une ligne de commande.

On souhaite par exemple récupérer la liste des portes ayant le nom “PorteVitrail”.
On commence classiquement par créer une collection de tous les éléments du modèle, que l’on filtre pour ne garder que les types de famille, que l’on filtre a nouveau pour ne garder que les portes.

Ensuite, on crée notre requête LINQ qui se compose de 3 parties :
_ quelle est la collection source (from in) : on veux travailler sur la collection crée ci-dessus, et on nomme l’élément courant de cette collection ‘e’.
_ quelle est la condition (where) : on veut comparer le nom de l’élément courant avec “PorteVitrail”
_ qu’est ce qu’on renvoi (select) : on veut renvoyer les éléments qui satisfont la condition ci-dessus.

FilteredElementCollector collector = new FilteredElementCollector(doc)
  .OfClass(typeof(FamilyInstance))
  .OfCategory(BuiltInCategory.OST_Doors);
var elements = from e in collector where e.Name == "PorteVitrail" select e);

Amélioration du code (refactoring)
Comme on récupère l’objet du where dans le select, on peut directement faire un where

var elements = collector.Where( e => e.Name = "PorteVitrail);

Amélioration du code (refactoring)
On peut appliquer le Linq directement sur la collection en cours de création

IList elements = new List();
foreach (FamilyInstance f in new FilteredElementCollector(doc)
.OfClass(typeof(FamilyInstance))
.OfCategory(BuiltInCategory.OST_Doors)
.Cast()
.Where(e => e.Name == "PorteVitrail"))
  {
    elements.Add(f);
  }

Amélioration du code (refactoring)
On peut si besoin supprimer la liste provisoire et travailler directement sur les éléments selectionnés

foreach (FamilyInstance element in (from e in new FilteredElementCollector(doc)
             .OfClass(typeof(FamilyInstance)) 
             .OfCategory(BuiltInCategory.OST_Doors) 
             .Cast() 
             where (e => e.Name == "PorteVitrail")
             select e))
{
  // element
}
Fermer le menu