c# - 传递表达式而不是 lambda
问题描述
全部!默认情况下,我将尝试为添加映射 db 列编写扩展。我使用 linq2db
这是我的方法
public static void EntityWithDefaults<T>(this FluentMappingBuilder fluentMappingBuilder) {
fluentMappingBuilder.Entity<T>().HasTableName(typeof(T).Name);
var item = Expression.Parameter(typeof(T), typeof(T).Name);
foreach (var prop in typeof(T).GetProperties()) {
if (prop.Name == "ID")
fluentMappingBuilder.Entity<T>().Property(x => Expression.Property(item, prop.Name)).IsIdentity().IsPrimaryKey();
else
fluentMappingBuilder.Entity<T>().Property(x => Expression.Property(item, prop.Name));
}
}
它没有用......但如果我这样写 - 一切都好
fluentMappingBuilder.Entity<AppLogLong>()
.HasTableName("AppLog")
.Property(x => x.ID).IsPrimaryKey().IsIdentity()
.Property(x => x.ActionDate)
.Property(x => x.ActionId)
.Property(x => x.EmployeeId)
.Property(x => x.RequestType);
我认为我的问题是属性的错误表达。你能帮我吗?
谢谢!
解决方案
x => x.ID
不一样x => Expression.Property(item, "ID")
。
您想要做的可能是:
foreach (var prop in typeof(T).GetProperties()) {
var parameter = Expression.Parameter(typeof(T), "x");
var property = Expression.Property(parameter, prop);
var cast = Expression.Convert(property, typeof(object));
var lambda = Expression.Lambda<Func<T, object>>(cast, parameter);
if (prop.Name == "ID")
fluentMappingBuilder.Entity<T>().Property(lambda).IsIdentity().IsPrimaryKey();
else
fluentMappingBuilder.Entity<T>().Property(lambda);
}
也就是说,我们必须自己构建整个LambdaExpression
。
推荐阅读
- java - 根据日期时间和持续时间列从表 t1 中选择学生待在一起的行
- python - 如何在匹配字符串的嵌套列表中找到索引的最小值和最大值?
- python - 安装tensorflow时如何修复虚拟环境中发生的EnvironmentError
- javascript - 在单个弹出窗口中显示具有相同纬度/经度坐标的多个标记
- python - 如何在 Python 中将元组列表读取为列表类型并将元组读取为以字符串形式编码的元组类型?
- html - 使用 CSS 在表格列中创建类似标记的效果
- javascript - 返回最大值(ASCII)
- python - 我正在尝试使用两个不同的异步定义(@client.event 和 @bot.command())但是其中一个不起作用
- javascript - 计算 2 lat/lons 之间道路折线上的距离
- c++ - 运行 IF 语句而不是 ELSE 语句需要什么?