更新问题以更清楚地了解我要在这里做什么。
我在这里真正想做的是使用Z.EntityFramework.Extensions批量将一些数据合并到数据库中。具体来说,我正在尝试在options.ColumnInputExpression中创建指令,该指令采用上述表达式i。您可以在dotnetfiddle.net/lwF8DZ
上看到一个示例。我已经为此工作了几天,似乎没有任何进展。这就是我所拥有的。
让我说我有Customer类。
public class Customer
{
public int CustomerID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public bool IsActive { get; set; }
}
使用类似的方法,我可以创建一个简单的表达式来定位“ Description”和“ IsActive”字段
Expression<Func<Customer, object>> fieldsToUse = c => new { c.Description, c.IsActive };
此表达式正是我想要的,但是我不能对其加硬,相反,我必须使用这样的列表:
List<string> fld = new List<string>();
fld.Add("Description");
fld.Add("IsActive");
到目前为止,我已经设法使用了它:
public static Expression<Func<T, object>> GetExpression<T>(string propName)
{
var arg = Expression.Parameter(typeof(T), "c");
var property = Expression.Property(arg, propName);
var conversion = Expression.Convert(property, typeof(object));
var exp = Expression.Lambda<Func<T, object>>(conversion , new ParameterExpression[] { arg });
return exp;
}
我可以这样称呼:
var exp = GetExpression<Customer>("IsActive");
但这只会给我以下内容:
Expression<Func<Customer, object>> sample = c => c.IsActive;
如何使用已有的内容创建初始表达式?
Expression<Func<Customer, object>> sample = c => new { c.Description, c.IsActive };
任何帮助将不胜感激。提前致谢!
答案 0 :(得分:1)
您实际上不需要执行正在解决的问题的工作。 Z.EntityFramework.Extensions
中的批量插入选项包括一个ColumnInputNames
属性,您可以使用它来代替提供表达式。表达式语法可能只是一种方便的方法,可以解析您提供的表达式并将其转换为属性名称列表。
context.BulkInsert(list, options =>
options.ColumnInputNames = new List<string>{ "Name", "IsActive" });
或者,根据您动态生成的fld
列表:
context.BulkInsert(list, options => options.ColumnInputNames = fld);