【问题标题】:How to convert between LINQ expressions如何在 LINQ 表达式之间进行转换
【发布时间】:2013-12-05 12:28:59
【问题描述】:

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

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

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&lt;System.Func&lt;TDTOEntity,bool&gt;&gt;System.Linq.Expressions.Expression&lt;System.Func&lt;TEntity,bool&gt;&gt;

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

【问题讨论】:

  • 很明显,Funcdelegate 有不同的输入参数
  • 这几乎是不可能的,因为您无法告诉编译器 TEntity 和 TDOTOEntity 如何关联。我认为可以通过反射重建表达式。不过,我不想在那个上面烫伤我的手指

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


【解决方案1】:

好吧,如果您的服务层的方法不知道存储库实体,则没有解决方案。

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

因为即使参数没有错误,repository.Single 怎么知道涉及哪个存储库实体?

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

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

或者这个(如果ProjectedAs 进行枚举就没有意义,我希望这不是真的。假设你有一个方法All&lt;TEntity&gt;,或者类似的方法返回一个IQueryable&lt;TEntity&gt;

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2010-09-12
    • 2012-07-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多