投票我的问题要关闭
我找到了一个类似的问题和一个非常有用的答案
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
类型的更新方法是否像上面的代码一样工作?非常感谢!
答案 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属性,则可能无法成功 - 您需要处理此问题。
我已经为你提供了一个起点,我也将自己尝试这个,我稍后会更新这个答案 - 但是你可以自己尝试一下这么久。