如何在LINQ表达式之间进行转换

时间:2013-12-05 12:29:00

标签: c# asp.net .net linq c#-4.0

我的存储库中的方法与服务层中的调用方法之间存在兼容性问题。

我的存储库类中的方法如下所示:

public TEntity Single(Expression<Func<TEntity, bool>> predicate)
{
     // Code left out
}

然后调用上述方法的服务层中的方法如下所示:

public TDTOEntity Single(Expression<Func<TDTOEntity, bool>> predicate)
{
     return repository.Single(predicate).ProjectedAs<TDTOEntity>();
}

我得到的错误是:

  

无法转换   System.Linq.Expressions.Expression<System.Func<TDTOEntity,bool>>来   System.Linq.Expressions.Expression<System.Func<TEntity,bool>>

如何在两个表达式之间进行转换?这样的事情是可能的吗?

1 个答案:

答案 0 :(得分:0)

如果服务层的方法不知道存储库实体,那么,没有解决方案。

这对所有“映射”系统都有意义:如果你不知道源和目标,那你就麻烦了!

因为即使参数没有出错,repository.Single如何知道哪个存储库实体有关?

所以你必须以这种方式改变你的方法

public TDTOEntity Single<TEntity, TDTOEntity>(Expression<Func<TEntity, bool>> predicate)
{
     return repository.Single(predicate).ProjectedAs<TDTOEntity>();
}

或者这个(如果ProjectedAs进行枚举就没有意义,我希望这不是真的。假设你有一个方法All<TEntity>,或等价的东西返回{{1} })

IQueryable<TEntity>

使用类型作为参数和反射,这些解决方案可能略有不同,但是......无论如何,你需要知道TEntity和TDTOEntity之间的关系。