如何解决动态Lambda表达式-选择一个子属性
我尝试生成Lambda表达式以选择日期属性和值属性,以在客户端生成图形。
我想出了以下代码-选择Value Property
void Main()
{
// key to be selected by end user - to view values of it by datetime
var inputKey = nameof(VehicleSensorLog.iTemperatureSensor1);
// always need datetime for graph
var dateKey = nameof(VehicleSensorLog.VehicleMonitoringLog.dtUTCDateTime);
Type gType = typeof(GraphDTO);
Type inputType = typeof(VehicleSensorLog);
ParameterExpression xParam = Expression.Parameter(inputType,"g");
// new statement "new GraphDTO()"
var xNew = Expression.New(gType);
// select properties
var xPropValue = gType.GetProperty(nameof(GraphDTO.Value));
var xSourceValue = Expression.Property(xParam,inputType.GetProperty(inputKey));
var xPropDateTime = gType.GetProperty(nameof(GraphDTO.LogDateTime));
// HOW TO DO THIS?
// -----------------
var xSourcePropDateTime = Expression.PropertyOrField(xParam,"VehicleMonitoringLog.dtUTCDateTime");
// Bind / Map from Origional to New GraphDTO property (set value "Field1 = o.Field1")
var xBindExpression = Expression.Bind(xPropValue,xSourceValue);
var xBindExpressionDateTime = Expression.Bind(xPropDateTime,xSourceValue);
// initialization "new Data { Field1 = o.Field1,Field2 = o.Field2 }"
var xInit = Expression.MemberInit(xNew,new List<MemberAssignment>() { xBindExpression,xBindExpressionDateTime });
// expression "o => new Data { Field1 = o.Field1,Field2 = o.Field2 }"
var lambda = Expression.Lambda<Func<VehicleSensorLog,GraphDTO>>(xInit,xParam);
// finally select the logs based on lambda created
this.VehicleSensorLogs.Select(lambda).Take(10).Dump();
}
public class GraphDTO
{
public DateTime LogDateTime { get; set; }
public Double? Value { get; set; }
}
我无法从源中选择DateTime属性,因为它是导航(子)属性。我尝试了以下两种方法:
var xSourcePropDateTime = Expression.PropertyOrField(xParam,"VehicleMonitoringLog.dtUTCDateTime");
var xSourcePropDateTime = Expression.Property(xParam,inputType.GetProperty("VehicleMonitoringLog.dtUTCDateTime"));
如何为子属性创建表达式?
解决方法
PropertyOrField方法不支持用于访问嵌套属性的点表示法,因此您需要像这样连续获取属性:
import (
"gorm.io/gorm"
"gorm.io/driver/mysql"
)
func main(){
db,err := gorm.Open(mysql.Open(MYSQL_CONNECTION_STRING),&gorm.Config{})
if err != nil {
fmt.Println(err.Error())
}else{
db.Clauses(clause.Insert{Modifier: "IGNORE"}).Create(&user)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。