在 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));
我们目前在代码中有逻辑来忽略具有忽略值的属性(例如,如果 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));