1

投票结束我的问题

我使用 ExpressionVisitor类找到了一个类似的问题和一个非常有用的答案(链接: 如何在不同(但兼容)模型之间转换 lambda 表达式?)。谢谢大家,我投票给我的答案因重复而关闭,也请考虑投票。

代码

我正在开发一个使用数据传输对象的存储库代码,如下面的代码。

public class UsuarioRepositorio : IUsuarioRepository
{
    private readonly MongoRepository<UsuarioDto> _Repository;

    public UsuarioRepository(string connectionString)
    {
        _Repositorio = new MongoRepository<UsuarioDto>(connectionString, "");
    }
}

public interface IUsuarioRepository
{  
    IEnumerable<T> Select(Expression<Func<Usuario, bool>> predicate);
}
  • UsuarioDto是Usuario类的数据传输对象,都继承自接口IUsuario

  • UsuarioRepository实现了IUsuarioRepository接口,有一个私有成员叫_Repository,属于该类型。MongoRepository<UsuarioDto>

  • _Repository成员有一个名为Select的方法,它接受 type 的参数Expression<Func<UsuarioDto, bool>>

  • IUsuarioRepository有一个名为Select的声明方法,该方法接受 type 的参数Expression<Func<Usuario, bool>>


问题

问题是我需要在UsuarioRepository中实现Select方法,使用IUsuarioRepository方法签名并向_Repository传递一个新的类型表达式,具有相同的参数参数。Expression<Func<UsuarioDto, bool>>Expression<Func<Usuario, bool>>

基本上我需要一种将表达式参数复制到不同类型的新表达式的方法,知道表达式具有相同的属性,因为它们具有相同的接口继承。像这样的东西:

public IEnumerable<Usuario> Select(Expression<Func<Usuario, bool>> predicate)
{
    Expression<Func<UsuarioDto, bool>> transferExpression = x => x != null;
    transferExpression = transferExpression .Update(predicate.Body, predicate.Parameters);

    return _Repository.Select(transferExpression ).ToList().Select(x => x.ToDomain());
}


问题

  • 类型的Update方法Expression是否像上面的代码一样工作?
  • 如果它不起作用,有没有办法复制不同类型的表达式,但具有相同的基本/接口属性?

非常感谢!

4

1 回答 1

0

我有一篇关于在这里组合相同类型的 2 个表达式的博客文章:http: //blog.waseem-sabjee.com/2013/07/23/linq-expression-how-to-append-to-an-expression-at -后期/

要使用 2 种类型,您需要做的就是更改我的扩展类LambdaExtensions中的静态方法以使用 T、T2 而不是 T

一个警告,如果引用 T2 的一个不在 T1 中的属性,它可能不会成功 - 你需要处理这个。

我已经为您提供了一个起点,我自己也会尝试这个,稍后我会更新这个答案 - 但您可以随意尝试这么久。

于 2013-07-23T22:30:00.930 回答