1

我有以下代码:

      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 一样,只是有可能传递用于确定项目是否需要更新或插入的属性。

4

0 回答 0