使用另一个表达式的参数创建LinQ表达式

时间:2013-07-23 18:31:23

标签: c# .net linq lambda

  

投票我的问题要关闭

     

我找到了一个类似的问题和一个非常有用的答案   ExpressionVisitor课程(链接:   How can I convert a lambda-expression between different (but compatible) models?)。   谢谢大家,我投票给我的答案关闭,重复,请考虑投票。

代码

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

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 接口。

    < / LI>
  • UsuarioRepository 实现 IUsuarioRepository 接口,并且有一个名为_Repository的私有成员,属于MongoRepository<UsuarioDto>类型。

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

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


问题

问题是我需要在 UsuarioRepository 中实现选择方法,使用 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());
}


问题

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

非常感谢!

1 个答案:

答案 0 :(得分:0)

我有一篇关于在这里组合两个相同类型的表达式的博文: 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

警告,如果引用不属于T1的T2属性,则可能无法成功 - 您需要处理此问题。

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