在 Servicestack Ormlite 中创建一个动态的 UpdateOnly 表达式

Create a dynamic UpdateOnly Expression in Servicestack Ormlite

我们目前在代码中有逻辑来忽略具有忽略值的属性(例如,如果 int 属性的值为 Int32.MinValue + 1 那么我们将不会将其包含在输出 SQL更新。

我可以从我的对象构建 onlyFields Expression<Func<T, TKey>> onlyFields 对象吗?有什么方法可以循环对象中的所有属性并从中构建 onlyFields 表达式?

public void Update(SSDataProduct dbProduct)
{
    using (var db = DbFactory.OpenDbConnection())
    {
        db.UpdateOnly(dbProduct,
            onlyFields: p => new { p.ProductName, p.Density },  // <-- needs to be dynamic
            where: p => p.Id == dbProduct.Id);
    }
}

在 C# 中动态创建匿名类型与创建普通类型相同,by using Reflection.Emit

但在这种情况下,使用 SqlExpression 重载会更容易,例如:

db.UpdateOnly(dbProduct, q => q
    .Update(new[]{ "Field1" }.ToList())
    .Where(p => p.Id == dbProduct.Id));