属性名称作为C#中的Lambda表达式

时间:2020-05-12 13:17:00

标签: c# linq lambda

更新问题以更清楚地了解我要在这里做什么。

我在这里真正想做的是使用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 };

任何帮助将不胜感激。提前致谢!

1 个答案:

答案 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);
相关问题