我试图弄清楚如何在两种类型之间转换Linq表达式:一个在我的Business Repository中,另一个在Domain Repository中。两种类型都具有将在查询中使用的相同数据属性。在我的业务层中,我有以下方法将基于业务实体执行查询:
BUSINESS REPOSITORY:转换为业务实体的域实体
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中调用以下方法。它将从数据库中检索原始的加密域实体。请注意,其查询需要Domain Repository中使用的实体类型。它与我们的业务实体有关,但仅涉及CRUD操作。
DOMAIN REPOSITORY:来自数据库的原始加密实体
public IQueryable<CustomerVendorProductEntity> Query(Expression<Func<CustomerVendorProductEntity, bool>> filter)
因此,Business Repository中的Query()方法将执行以下操作:
var domainList = DomainRepository.Query(filterInBusinessRepo);
结果将是CustomerVendorProductEntity对象的列表。然后,业务存储库将它们转换为CustomerVendorBusiness实体并将它们返回给调用者。
所以,我的问题是如何将Linq Expression从Business Repository Entity Type:CustomerVendorProduct转换为Domain Repository Entity Type: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应用程序中...仍然希望得到帮助......
答案 0 :(得分:0)
我开发的MVC应用程序我做了类似的事情,但只有一组实体对象(即业务层使用与ORM相同的实体)。它工作得很好(业务线应用程序只具有基本的CRUD功能),虽然它与传递的所有表达式有点混淆。
在您的情况下,我认为您将无法遍历业务存储库表达式树并使用域存储库对象重新创建它,正如您在转换代码中所提到的那样。我不能就此提出任何建议,除了它可能不会简单地实施或完全验证。
从我在大多数时候看到的'真实'MVC应用程序中,表达式不会在层之间传递,而是使用标准API来传递将最终构建到数据层中的查询中的内容。
答案 1 :(得分:0)
Translating expression tree from a type to another type with complex mappings
这是一个非常类似的问题的答案,我帮助了一个人。检查一下,如果这不符合您的需求,请告诉我。