2009-12-30 1 views
0

Смущающий вопрос действительно - у меня есть субзвуковая коллекция, затем я отфильтровываю некоторые данные, используя Where.Как конвертировать IEnumerable в коллекцию Subsonic?

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

сейчас я хотел бы передать эти данные еще в качестве коллекции подзонсов. Как это сделать (наиболее правильно)? Я проверил конструктор для Subsonic collection, ToX() и googled.

Редактировать: Subsonic 2.x series.

Спасибо заранее, и извините за наивный вопрос.

ответ

2

В SubSonic 2.x данные фактически не отфильтрованы с помощью Where(), пока запрос не будет повторно выполнен в отношении базы данных. Я предполагаю, что это то же самое в версии 3.0. В 2.x был метод .Filter(), который будет делать то, что вы ищете.

Метод .Filter() добавляется к сгенерированным классам. Вот что мое выглядит (это настроить от значения по умолчанию):

/// <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

Спасибо вы за указание версии, я забыл упомянуть, что это 2.x серия. Я не вижу метод фильтра. – greenoldman

+0

@macias - извините за задержку в ответе! Я добавил образец кода. –

1

По некоторым причинам я никогда не мог получить метод рядный фильтра для работы, но его легко использовать, как это:

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

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

Спасибо, из ваших примеров (ваших и Раноморов) видно, что мне нужно хотя бы небольшое обновление Subsonic :-) – greenoldman

 Смежные вопросы

  • Нет связанных вопросов^_^