如何将IEnumerable转换为Subsonic集合?

时间:2009-12-30 12:04:50

标签: linq subsonic ienumerable collections

真的令人尴尬的问题 - 我有Subsonic集合,然后我使用Where过滤掉一些数据。

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

现在我想将这些数据作为Subsonic集合传递。怎么做(最合适的方式)?我检查了构造函数的Subsonic集合,ToX()方法和googled。

编辑:Subsonic 2.x系列。

提前谢谢你,抱歉天真的问题。

2 个答案:

答案 0 :(得分: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;
    }


}

答案 1 :(得分:1)

出于某种原因,我永远无法使用过滤器的内联方法,但它易于使用,如下所示:

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

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