2009-12-30 7 views
0

Question embarrassante vraiment - J'ai la collection Subsonic, puis je filtre certaines données en utilisant Où.Comment convertir IEnumerable en collection Subsonic?

MyColl.Where(it => it.foo()==true) 

maintenant je voudrais transmettre ces données encore comme collection Subsonic. Comment le faire (le plus correctement)? J'ai vérifié le constructeur pour la collection Subsonic, les méthodes ToX(), et googled.

éditer: Série Subsonic 2.x.

Merci d'avance, et désolé pour question naïve.

Répondre

2

Dans SubSonic 2.x, les données ne sont pas réellement filtrées avec Where() tant que la requête n'a pas été réexécutée par rapport à la base de données. Je suppose que c'est la même chose dans 3.0. Dans 2.x il y avait une méthode .Filter() qui ferait ce que vous cherchez.

La méthode .Filter() est ajoutée aux classes générées. Voilà ce que le mien ressemble (il est personnalisé à partir de la valeur par défaut):

/// <summary> 
    /// Filters an existing collection based on the set criteria. This is an in-memory filter. 
    /// All existing wheres are retained. 
    /// </summary> 
    /// <returns>TblSomethingOrOtherCollection</returns> 
    public TblSomethingOrOtherCollection Filter(SubSonic.Where w) 
    { 
     return Filter(w, false); 
    } 

    /// <summary> 
    /// Filters an existing collection based on the set criteria. This is an in-memory filter. 
    /// Existing wheres can be cleared if not needed. 
    /// </summary> 
    /// <returns>TblSomethingOrOtherCollection</returns> 
    public TblSomethingOrOtherCollection Filter(SubSonic.Where w, bool clearWheres) 
    { 
     if (clearWheres) 
     { 
      this.wheres.Clear(); 
     } 
     this.wheres.Add(w); 
     return Filter(); 
    } 

    /// <summary> 
    /// Filters an existing collection based on the set criteria. This is an in-memory filter. 
    /// Thanks to developingchris for this! 
    /// </summary> 
    /// <returns>TblSomethingOrOtherCollection</returns> 
    public TblSomethingOrOtherCollection Filter() 
    { 
     for (int i = this.Count - 1; i > -1; i--) 
     { 
      TblSomethingOrOther o = this[i]; 
      foreach (SubSonic.Where w in this.wheres) 
      { 
       bool remove = false; 
       System.Reflection.PropertyInfo pi = o.GetType().GetProperty(w.ColumnName); 
       if (pi != null && pi.CanRead) 
       { 
        object val = pi.GetValue(o, null); 
        if (w.ParameterValue is Array) 
        { 
         Array paramValues = (Array)w.ParameterValue; 
         foreach (object arrayVal in paramValues) 
         { 
          remove = !Utility.IsMatch(w.Comparison, val, arrayVal); 
          if (remove) 
           break; 
         } 
        } 
        else 
        { 
         remove = !Utility.IsMatch(w.Comparison, val, w.ParameterValue); 
        } 
       } 


       if (remove) 
       { 
        this.Remove(o); 
        break; 
       } 
      } 
     } 
     return this; 
    } 


} 
+0

Remerciez vous pour signaler la version, j'ai oublié de le mentionner c'est la série 2.x. Je ne vois pas la méthode de filtrage. – greenoldman

+0

@macias - désolé pour le retard dans la réponse! J'ai ajouté un échantillon de code. –

1

Pour une raison que je ne pourrais jamais obtenir la méthode en ligne de filtre fonctionne, mais il est facile à utiliser comme ceci:

SubSonic.Where w = new Where(); 
     w.ColumnName = Product.CatIDColumn.PropertyName; 
     w.Comparison = Comparison.Equals; 
     w.ParameterValue = "1"; 

ProductCollection objFilteredCol = objProdCollection.Where(w).Filter(); 
+0

Merci, il ressort de vos exemples (le vôtre et celui de Ranomore) que j'ai besoin d'au moins une légère amélioration de Subsonic :-) – greenoldman

Questions connexes