使用另一个表达式创建LinQ表达式';s参数

本文关键字:表达式 参数 LinQ 另一个 创建 | 更新日期: 2023-09-27 18:24:39

投票结束我的问题

我发现了一个类似的问题和一个非常有用的答案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);
}
  • UsuarioDtoUsuario类的数据传输对象,两者都继承自接口IUsuario

  • UsuarioRepository实现IUsuarioRepository

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

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


问题

问题是,我需要在UsuarioRepository中实现Select方法,使用IUsuarioRepositoryRepository传递一个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());
}


问题

  • Expression类型的Update方法是否与上面的代码类似
  • 如果不起作用,是否有方法复制不同类型但具有相同基本/接口属性的表达式

非常感谢!

使用另一个表达式创建LinQ表达式';s参数

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

要使用2种类型,您只需更改我的扩展类LambdaExtensions中的静态方法,即可使用T,T2而不是T

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

我已经为你提供了一个起点,我也会自己尝试,我稍后会更新这个答案——但请放心自己尝试这么久。