使用另一个表达式创建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);
}
UsuarioDto是Usuario类的数据传输对象,两者都继承自接口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方法是否与上面的代码类似- 如果不起作用,是否有方法复制不同类型但具有相同基本/接口属性的表达式
非常感谢!
我有一篇关于在这里组合两个相同类型的表达式的博客文章: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中的属性,它可能不会成功——你需要处理这个问题。
我已经为你提供了一个起点,我也会自己尝试,我稍后会更新这个答案——但请放心自己尝试这么久。