c# - 组合多个 SubSonic.Where 过滤器

标签 c# .net-3.5 subsonic

是否可以将 Subsonic 2.1 中的多个过滤器组合成更短的代码?

    SubSonic.Where filterTaal = new SubSonic.Where();
        filterTaal.ColumnName = Pagina.Columns.Taal;
        filterTaal.Comparison = SubSonic.Comparison.Equals;
        filterTaal.ParameterValue = taal;

    SubSonic.Where filterKey = new SubSonic.Where();
        filterKey.ColumnName = Pagina.Columns.PaginaKey;
        filterKey.Comparison = SubSonic.Comparison.Equals;
        filterKey.ParameterValue = paginaKey;

        PaginaCollection paginaCollection = new PaginaCollection()
            .Where(filterTaal)
            .Where(filterKey) 
            .Load();

我觉得上面的代码可以更短一些?

最佳答案

您可以编写自己的扩展方法并使用 ExpressionTrees。 结果将是这样的:

PaginaCollection paginaCollection = new PaginaCollection()
    .SlimWhere(x => x[paginaColumns.PaginaKey] == paginaKey)
    .SlimWhere(x => x[paginaColumns.Taal] == taal)
    .Load();

扩展方法将是 smth。像这样:

public static PaginaCollector SlimWhere(this PaginaCollector paginaCollector, Expression<Func<WhereDummy, bool>> expression)
{
    var mainExpression = expression.Body as BinaryExpression;
    SubSonic.Where result = ParseFilter(mainExpression);

    switch (mainExpression.NodeType)
    {
        case ExpressionType.Equal:        
            result.Comparison = Comparison.Equals;
            break;

        ...

        default:
            throw new NotImplementedException();
    }

    return paginaCollector.Where(result);
}

辅助方法将是:

private static SubSonic.Where ParseFilter(BinaryExpression expression)
{
    var columnNameMethod = (MethodCallExpression)expression.Left;
    var columnNameExpression = columnNameMethod.Arguments[0];

    var parameterValueExpression = expression.Right;

    string columnName = GetValue<string>(columnNameExpression);
    object parameterValue = GetValue<object>(parameterValueExpression);

    Where result = CreateWheteFilterDummy(columnName, parameterValue);

    return result;
}

private static Where CreateWheteFilterDummy(string columnName, object parameterValue)
{
    SubSonic.Where result = new Where();
    result.ColumnName = columnName;
    result.ParameterValue = parameterValue;
    return result;
}

private static T GetValue<T>(Expression columnNameExpression)
{
    var columnNameObjectMember = Expression.Convert(columnNameExpression, typeof(T));
    var columnNameGetter = Expression.Lambda<Func<T>>(columnNameObjectMember);
    return columnNameGetter.Compile()();
}

WhereDummy 是一个虚拟类,只是为了提供更易读的语法,因为 .SlimWhere(paginaColumns.PaginaKey == paginaKey) 不是那么容易理解。

public class WhereDummy
{
    public string this[string columnname]
    {
        get
        {
            return columnname;
        }
    }
}

关于c# - 组合多个 SubSonic.Where 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5805358/

相关文章:

c# - 继续断言

c# - 使用带有 sql 查询的 ado.net 时计算年龄?

visual-studio - 无法加载项目文件。缺少根元素

c# - Subsonic 3 ActiveRecord 生成问题

c# - Subsonic - Active Records 并没有占据我所有的 table

c# - .NET Framework 2.0 中集合的替代方案

c# - 自定义类型作为主键

c# - Visual Studio 2010 只能运行 4.0 单元测试吗?

c# - 在 spring.net 中预实例化原型(prototype)

c# - 如何查看 SubSonic SimpleRepository 生成的 SQL?