1

我试图弄清楚如何在两种类型之间转换 Linq 表达式:一种在我的业务存储库中,一种在域存储库中。两种类型都具有将在查询中使用的相同数据属性。在我的业务层中,我有以下方法将基于业务实体执行查询:

业务存储库:域实体转换为业务实体

public IQueryable<CustomerVendorProduct> Query(Expression<Func<CustomerVendorProduct,bool>> filterInBusinessRepo)

因此,消费者可以执行以下操作:

var list = BusinessRepository.Query(c => c.CustomerId == 77);

他们将获得 CustomerId == 77 的 CustomerVendorProduct 业务对象列表。

在 Business Repository 的 Query() 方法中,我需要在 Domain Repository 中调用以下方法。它将从数据库中检索原始的加密域实体。请注意,它的查询需要域存储库中使用的实体类型。它与我们的业务实体有关,但仅涉及 CRUD 操作。

域存储库:来自数据库的原始加密实体

public IQueryable<CustomerVendorProductEntity> Query(Expression<Func<CustomerVendorProductEntity, bool>> filter)

因此,Business Repository 中的 Query() 方法将执行以下操作:

var domainList = DomainRepository.Query(filterInBusinessRepo);

结果将是 CustomerVendorProductEntity 对象的列表。然后,业务存储库将它们转换为 CustomerVendorBusiness 实体并将它们返回给调用者。

所以,我的问题是如何将 Linq 表达式从业务存储库实体类型:CustomerVendorProduct 转换为域存储库实体类型:CustomerVendorProductEntity?我认为我必须创建一种转换方法...类似于以下内容...但是,我不知道如何实现转换。我将衷心感谢您的帮助:

    // Convert the Linq Expression from our Business Layer to our Domain Layer.
    private Expression<Func<CustomerVendorProductEntity, bool>> CVPToCVPE(Expression<Func<CustomerVendorProduct, bool>> filter)
    {
        var parms = System.Linq.Expressions.Expression.Parameter(typeof(CustomerVendorProductEntity), "destination");

        var result = System.Linq.Expressions.Expression.Lambda<Func<CustomerVendorProductEntity, bool>>(filter, parms);

        return result;
    } 

感谢您的时间和建议!麦克风

2012 年 11 月 2 日:哇,没有回复?我原以为很多其他开发人员都遇到过这个问题,尤其是在 MVC 应用程序中......仍然希望得到帮助......

4

2 回答 2

0

我不久前开发的一个 MVC 应用程序我做了类似的事情,但只有一组实体对象(即业务层使用与 ORM 相同的实体)。它工作得很好(业务线应用程序只有基本的 CRUD 功能),尽管它与传递的所有表达式有点混淆。

在您的情况下,我认为您将无法遍历业务存储库表达式树并使用域存储库对象重新创建它,正如您在转换代码中所暗示的那样。除了实施或完全验证可能不会简单之外,我无法对此提出任何建议。

从我在“真正的”MVC 应用程序中看到的大部分时间来看,表达式不会在层之间传递,而是使用标准 API 来传递最终将构建到数据层中的查询中的内容。

于 2012-11-02T19:52:51.933 回答
0

使用复杂映射将表达式树从一种类型转换为另一种类型

这是我帮助一个人的一个非常相似的问题的答案。检查一下,如果这不能满足您的需求,请告诉我。

于 2013-02-25T18:57:27.867 回答