如何使用 ServiceStack OrmLite 将 SqlExpression<T> 转换为 SqlExpression<TU>?

How to convert SqlExpression<T> into SqlExpression<TU> with ServiceStack OrmLite?

我需要在私有方法中使用 SqlExpression<T>,但结果应该是 SqlExpression<TU>(由于我的项目上下文)。 T 和 TU 目标相同的结构(TUT 的子集,带有一些计算表达式) 我没有找到将 SqlExpression<T> 转换为 SqlExpression<TU> 的方法。

在以下代码中,T = 产品 class 和 TU = 粉末 class。

// Sample code
private static SqlExpression<Powder> CreateDefaultExpression(IDbConnection db, IPowderListFilter request)
{
    var ev = db.From<Product>()
    // Joins are set here...
            .Select(p => new
            {
                CustomRalId = Sql.As(p.CustomRalId, nameof(Powder.CustomRalId)),
                Mass = Sql.As(Sql.Sum(p.Width * p.Height / 1000000) * 2 * Settings.LacqueringGramsPerSquareMeter / 1000, nameof(Powder.Mass))
            });

    // I need to do something like...
    ev.ConvertTo<SqlExpression<Powder>>();
    // or ...
    return new SqlExpression<Powder>(ev);
}

你基本上不能,类型化的 SqlExpression 是一个查询构建器,你不能只更改类型并让它自动擦除所有突变并将所有突变重新应用到使用不同类型的查询构建器。

如果重用是您的目标,您需要使用标准 C# 来 DRY 尽可能多的代码,这不会太多,因为所有 lambda 表达式都键入不同的类型。