【问题标题】:Create a LinQ Expression with another Expression's Parameters使用另一个表达式的参数创建一个 LinQ 表达式
【发布时间】:2013-07-23 18:31:22
【问题描述】:

投票结束我的问题

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

  • UsuarioRepository实现了IUsuarioRepository接口,有一个私有成员_Repository,属于MongoRepository&lt;UsuarioDto&gt;类型。

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

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


问题

问题是我需要在 UsuarioRepository 中实现 Select 方法,使用 IUsuarioRepository 方法签名并传递给 _Repository Expression&lt;Func&lt;UsuarioDto, bool&gt;&gt; 类型的新表达式,与 Expression&lt;Func&lt;Usuario, bool&gt;&gt; 参数的参数相同。

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

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 方法是否像上面的代码一样工作?
  • 如果不起作用,有没有办法复制不同类型但具有相同基/接口属性的表达式?

非常感谢!

【问题讨论】:

标签: c# .net linq lambda


【解决方案1】:

我有一篇关于在此处组合 2 个相同类型的表达式的博客文章: 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 中的属性,它可能不会成功 - 你需要处理这个。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多