我有以下代码:
var existing = new[] { "first", "second" };
Func<TestType, string> func = type => type.TextCol;
Expression<Func<TestType, bool>> exp = q => existing.Contains(func(q));
并拥有Expression访客。
访问者在原始表达式中看到MethodCallExpression
Contains
,它有两个参数 - 一个是字符串值数组,第二个是InvocationExpression
,它是原始表达式中的func(q)
部分。
我需要以某种方式从原始函数中使用的InvocationExpression
中提取属性名称。我认为这应该是可能的,但是看看调试器中的InvocationExpression
实例无法知道怎么可能有人可以提供帮助?
我打算做的是
public IEnumerable<TEntity> FindExisting<TEntity, TValue>(IEnumerable<TEntity> list, Func<TEntity, TValue> property)
{
var values = list.Select(property);
Expression<Func<TEntity, bool>> exp = q => list.Contains(property(q));
return db.Select<TEntity>(exp);
}
全文:) 所以ServiceStack.OrmLite有方法SaveAll,它接受实体列表,检查数据库中哪些存在并更新它们,插入休息。所有这一切都运行正常,问题是,他们正在使用Id字段来检查项目是否存在于数据库中。在我的情况下,我有另一个唯一的字段,它是外部系统中的主键,当我从外部系统获取实体时,我检查是否需要插入或更新它们将更容易使用该字段,而不是Id,所以我以为我会编写扩展方法,它和SaveAll一样,只是有可能传递属性,用于确定项目是否需要更新或插入。