Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将查询表达式从DTO映射到实体对象_C#_Linq_Entity Framework_Linq To Entities_Automapper - Fatal编程技术网

C# 将查询表达式从DTO映射到实体对象

C# 将查询表达式从DTO映射到实体对象,c#,linq,entity-framework,linq-to-entities,automapper,C#,Linq,Entity Framework,Linq To Entities,Automapper,我继承了一个在业务层使用DTO的代码库,这些DTO是通过实体框架中的一组映射器填充的。这在查询方面有一些相当严重的限制,因此我正在开发一个新的“优化”查询服务 我的第一个问题是,我需要在我的DTO上转换我的LINQ查询来处理我的实体对象,但是调用上下文不知道EF实体。让我们假设我们可以依赖具有匹配名称的每个对象的属性 这就是我在剔除我想要的东西方面必须做到的: public static List<TDataObject> GetFiltered<TDataObject(

我继承了一个在业务层使用DTO的代码库,这些DTO是通过实体框架中的一组映射器填充的。这在查询方面有一些相当严重的限制,因此我正在开发一个新的“优化”查询服务

我的第一个问题是,我需要在我的DTO上转换我的LINQ查询来处理我的实体对象,但是调用上下文不知道EF实体。让我们假设我们可以依赖具有匹配名称的每个对象的属性

这就是我在剔除我想要的东西方面必须做到的:

   public static List<TDataObject> GetFiltered<TDataObject(Expression<Func<TDataObject, TDataObject>> projection, Func<TDataObject, bool> filter)
   {
        // 1. translate the filter parameter to work with my equivalent Entity object

        // 2. build the EF query with the modified filter expression and also a Select() projection so we only return the properties we need. (this should generate an optimised SQL query under the hood)

        // 3. map the results from the EF query back onto my TDataObject and return (I already have AutoMapper maps in place for this)
   }

publicstaticlist GetFiltered处理这个问题的一种方法是围绕查询构建原语(而不是带有存储库等的层)。我们的工作如下:

调用代码(控制器)知道查询和结果(DTO),但进行映射的片段确切地知道EF上下文/NHibernate会话。对我们来说效果很好,可以使控制器轻薄

或者,去掉图层,直接暴露EF对象:

var dtos = context.Employees.Where(e => e.IsActive)
    .Project().ToArray<EmployeeShowViewModel>();
var dtos=context.Employees.Where(e=>e.IsActive)
.Project().ToArray();

把它放在控制器中,因为谁在乎呢,层和抽象都是生产力的预防和时间的浪费。

很遗憾,我不能删除层,因为它们为应用程序提供了业务逻辑。还有许多其他应用程序访问此层。一定有办法翻译过滤器参数表达式?嗯,听起来情况不太好。您需要在封面下使用表达式树操纵——同样,这并不理想,但这是您必须要做的。