我有以下代码:
var existing = new[] { "first", "second" };
Func<TestType, string> func = type => type.TextCol;
Expression<Func<TestType, bool>> exp = q => existing.Contains(func(q));
并有表达访客。访问者看到MethodCallExpression
哪个Contains
在原始表达式中,它有两个参数 - 一个是字符串值数组,第二个是InvocationExpression
,它是func(q)
原始表达式的一部分。
InvocationExpression
我需要以某种方式从原始函数中使用的this 中提取属性名称。我认为这应该是可能的,但是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);
}
更新 2
整个故事:) 所以 ServiceStack.OrmLite 有方法SaveAll,它获取实体列表,在数据库中检查它们中的哪些存在并更新它们,其余的被插入。所有这些都工作正常,问题是,他们正在使用 Id 字段来检查数据库中是否存在项目。就我而言,我有另一个唯一字段,它是外部系统中的主键,当我从外部系统获取实体时,使用该字段而不是 Id 来检查是否需要插入或更新它们会容易得多,所以我想我会写扩展方法,它和 SaveAll 一样,只是有可能传递用于确定项目是否需要更新或插入的属性。