Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何有效地填充数据访问层模型?

如何有效地填充数据访问层模型?
EN

Stack Overflow用户
提问于 2012-07-12 10:12:16
回答 2查看 426关注 0票数 0

我正在使用ASP.net中的依赖注入开发我的第一个数据驱动域。

在我的数据访问层中,如果创建了一些域数据模型,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Company {
   public Guid CompanyId { get; set; }
   public string Name { get; set; }
}

public class Employee {
   public Guid EmployeeId { get; set; }
   public Guid CompanyId { get; set; }
   public string Name { get; set; }
}

然后我开发了一个接口,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface ICompanyService {
   IEnumerable<Model.Company> GetCompanies();
   IEnumerable<Model.Employee> GetEmployees();
   IEnumerable<Model.Employee> GetEmployees(Guid companyId);
}

在一个单独的模块中,我使用Linq to Sql实现了这个接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CompanyService : ICompanyService {

    public IEnumerable<Model.Employee> GetEmployees();
    {
        return EmployeeDb
            .OrderBy(e => e.Name)
            .Select(e => e.ToDomainEntity())
            .AsEnumerable();
    }
}

其中,ToDomainEntity()在employee存储库类中作为基本实体类的扩展方法实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Model.EmployeeToDomainEntity()
{
     return new  Model.Employee {
         EmployeeId = this.EmployeeId,
         CompanyId = this.CompanyId,
         Name = this.Name
     };
}

到目前为止,我已经或多或少地遵循了Mark Seeman的优秀著作“.NET中的依赖注入”中描述的模式-所有的模式都运行得很好。

但是,我想扩展我的基本模型,使其也包括关键参考模型,因此域Employee类将变为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Employee {
   public Guid EmployeeId { get; set; }
   public Guid CompanyId { get; set; }
   public Company { get; set; }
   public string Name { get; set; }
}

并且ToDomainEntity()函数将被扩展为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Model.Employee ToDomainEntity()
{
     return new  Model.Employee {
         EmployeeId = this.EmployeeId,
         CompanyId = this.CompanyId,
         Company = (this.Company == null) ? null : this.Company.ToDomainEntity()
         Name = this.Name
     };
}

我怀疑,从领域建模的角度来看,这可能是“糟糕的做法”,但我认为,如果我要开发一个特定的视图模型来实现同样的目的,我遇到的问题也会成立。

本质上,我遇到的问题是填充数据模型的速度/效率。如果我使用上面描述的ToDomainEntity()方法,Linq to Sql将创建一个单独的SQL调用来检索每个雇员的公司记录的数据。正如您所期望的那样,这大大增加了计算SQL表达式所需的时间(在我们的测试数据库上从大约100ms增加到7秒),特别是在数据树很复杂的情况下(因为要进行单独的SQL调用来填充树的每个节点/子节点)。

如果我以内联方式创建数据模型...

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public IEnumerable<Model.Employee> GetEmployees();
{
    return EmployeeDb
        .OrderBy(e => e.Name)
        .Select(e => new Model.Employee {
            EmployeeId = e.EmployeeId,
            /* Other field mappings */
            Company = new Model.Company {
               CompanyId = e.Company.CompanyId,
               /* Other field mappings */
            }
        }).AsEnumerable();
}

Linq to SQL生成了一条漂亮、紧凑的SQL语句,该语句本机使用“inner”方法将公司与员工关联起来。

我有两个问题:

1)从域类对象中引用关联的数据类是否被认为是“糟糕的做法”?

2)如果是这种情况,并且为此创建了一个特定的View Model,那么使用填充模型的正确方法是什么,而不必求助于创建内联赋值块来构建表达式树?

任何帮助/建议都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-13 08:14:26

这个问题是由于同时具有数据层实体和域层实体,并且需要两者之间的映射而引起的。虽然您可以让它工作,但这会使一切变得非常复杂,就像您已经经历过的那样。由于性能原因以及其他业务逻辑和表示逻辑将需要不同的数据,您正在进行数据和域之间的映射,并且很快将为这些相同的实体添加更多的映射。

唯一真正的解决方案是丢弃数据实体,并创建可直接序列化到后端存储(SQL server)的POCO模型对象。

POCO实体是LINQ to SQL从一开始就支持的东西,但我认为迁移到Entity Framework Code First会更好。

这样做时,您可以从存储库公开IQueryable<T>接口(您当前将存储库称为ICompanyService,但更好的名称应该是ICompanyRepository)。这使您可以进行高效的LINQ查询。当直接通过查询提供程序进行查询时,可以防止加载完整的实体。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from employee in this.repository.GetEmployees()
where employee.Company.Name.StartWith(searchString)
select new 
{
    employee.Name, 
    employee.Company.Location 
};

在使用IQueryable<T>时,LINQ to SQL和实体框架会将其转换为一个非常有效SQL查询,该查询只返回数据库中的雇员姓名和公司位置,并在数据库中进行筛选(与GetEmployees()返回IEnumerable<T>时在.NET应用程序中进行筛选相比)。

票数 1
EN

Stack Overflow用户

发布于 2012-07-12 22:03:37

您可以要求Linq2Sql使用DataLoadOptions.LoadWith方法预加载某些实体(而不是延迟加载它们),请参阅:http://msdn.microsoft.com/en-us/library/bb534268.aspx。如果您对Company实体执行此操作,那么我认为Linq2Sql将不必访问数据库来再次获取它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11449645

复制
相关文章
Spring Boot - 构建数据访问层
我们将进入 Spring Boot 另一个核心技术体系的讨论,即数据访问技术体系。无论是互联网应用还是传统软件,对于任何一个系统而言,数据的存储和访问都是不可缺少的。
小小工匠
2021/08/17
8430
Spring Boot -  构建数据访问层
Django - 模型层以及如何通过模型层来建表
模型 Django 提供了一个抽象的模型 ("models") 层, 什么是模型层? 这里模型的思想与Java中的ORM(Object Relationship Mapping) 对象关系映射类似 模型准确且唯一的描述了数据 它包含要储存的数据的字段 一般来说,每一个模型都映射一张数据库表 如何创建模型? 每个模型都是一个 Python 的类,这些类继承 django.db.models.Model 模型类的每个属性都相当于一个数据库的字段 利用这些,Django 提供了一个自动生成访问数据库
桑鱼
2020/03/27
8530
数据访问层的使用方法
数据访问层的使用方法。 数据访问层的使用方法 一、操作语句部分 简单的说就是传入一个操作语句,然后接收返回值就可以了。为了简化代码和提高效率,所以呢设置了五种返回类型。 1、 DataSet 函数名称:DateSet ds = RunSqlDataSet(查询语句) 传入一个查询语句(多条select 的查询语句),然后接收返回值就可以了。 没有记录返回 null 2、 DataTable 函数名称:DateTable dt = RunSqlDataTable(查询语句) 传入一个查询语句(一条selec
用户1174620
2018/02/07
1.6K0
如何更有效地利用数据中心空间?
数据中心空间是指可供服务器存储在数据设施中的租用空间区域,包括机架、机柜、私人套装等,它通常每周 7 天、每天 24 小时监控所有电气和机械系统,如今,越来越多的公司选择空间更大的数据中心来满足其不断增长的存储需求。
网络技术联盟站
2022/04/03
4000
如何更有效地利用数据中心空间?
模型层
torch.nn中内置了非常丰富的各种模型层。它们都属于nn.Module的子类,具备参数管理功能。
lyhue1991
2020/07/20
1.4K0
模型层
python-Django 模型层-模型层简介
Django是一个用于Web开发的高效框架,它提供了内置的ORM(对象关系映射)工具来简化与数据库的交互。在Django中,ORM的核心是模型层(Model Layer),它允许开发人员使用Python代码来定义数据库模型,并通过该模型进行数据操作。
玖叁叁
2023/04/23
4380
python-Django 模型层-模型层示例
下面是一个简单的示例,它演示了如何使用Django模型层来定义一个博客应用程序的模型、插入数据、查询数据和更新数据。
玖叁叁
2023/04/23
3510
如何有效地做算法题
这篇文章最早发在我团队的文档中。我的团队鼓励每个同学都在业余时间多做算法题,特别是新人。个人认为在编程能力的提升上比做 side project 更有用,对职业发展也是如此。当然出于兴趣做的 side project 另当别论。转到这里,希望对各位读者有用。
芋道源码
2019/05/17
7140
如何最有效地编写SQL
解决数据库级(SQL)工作上的问题,应该采用的是SET方法(整体的)而不是过程式的方法。下面来看看作者为什么这么说。 编写有效的SQL查询是企业软件世界中最大的难题之一。 每个公司在数据库开发项目中所面临的最根本的问题,在于开发环境中实现的性能不能在生产环境中实现。一般来说,存在性能损失是因为生产环境中的数据量要大得多。 这些问题(运行缓慢的数据库操作)可能有各种各样的原因。本文将解释如何在编写查询时进行思考,如何思考是最基本的问题,也是解决此类问题的起点。 观察发现SQL开发人员常使用过程方法编写查询。事
CSDN技术头条
2018/02/13
1K0
如何最有效地编写SQL
ndk开发之native层访问java层
  java层的成员变量可以分为实例变量和静态变量,不过他们的访问方法比较类似,可以分为以下三步:
故乡的樱花开了
2023/10/22
2550
ndk开发之native层访问java层
创新方案,如何更有效地预防数据泄露?
现代人类世界正处于一个高速发展的信息化时代,而数据作为信息化时代中的核心,已经融入到了社会中的点点滴滴,手机、微信、淘宝等信息化产物已贯穿于每个人的生活。信息化时代引领人类世界进步的同时,数据的副作用也慢慢显示出了它的威力。
绿盟科技研究通讯
2022/11/14
4210
创新方案,如何更有效地预防数据泄露?
模型层layers
如果这些内置模型层不能够满足需求,我们也可以通过编写tf.keras.Lambda匿名模型层或继承tf.keras.layers.Layer基类构建自定义的模型层。
lyhue1991
2020/07/20
1.5K0
模型层layers
如何有效地进行代码 Review?
| 导语  研发都知道代码 Review 的重要性,在腾讯代码 Review 也越来越受大家重视,作为腾讯专有云平台研发的一员,我参与了大量的代码 Review,明显地感受到有效的代码 Review 不但能提高代码的质量,更能促进团队沟通协作,建立更高的工程质量标准,无论对个人还是团队都有着重要的价值。本文就为什么要做代码 Review 以及如何有效地做代码 Review 分享一下个人的看法。 1 为什么要做代码 Review 为什么要代码 Review,相信每个人心中都有比较一致的答案,Google
腾讯大讲堂
2020/09/25
5380
OSI七层模型与TCP/IP五层模型
        今天我们先学习一下以太网最基本也是重要的知识——OSI参考模型。
明明如月学长
2021/08/31
5600
OSI七层模型与TCP/IP五层模型
使用Radon构建MySQL统一数据访问层
这篇也可以说是:RadonDB使用最佳建议,从原理上了解RadonDB的拆分后数据访问逻辑。Radon中整理架构如下:
田帅萌
2020/04/02
1.3K0
使用Radon构建MySQL统一数据访问层
6-数据链路层-介质访问控制子层
局域网中采用了共享传输介质的方式来降低成本,共享传输介质上通常采用的就是广播的通信方式
Ywrby
2022/10/27
2.6K0
6-数据链路层-介质访问控制子层
OSI七层模型与TCP/IP五层模型
        博主是搞是个FPGA的,一直没有真正的研究过以太网相关的技术,现在终于能静下心学习一下,希望自己能更深入的掌握这项最基本的通信接口技术。下面就开始搞了。
smy
2019/03/22
1.2K0
OSI七层模型与TCP/IP五层模型
python-Django 模型层-模型层的字段类型
Django模型层的字段类型决定了数据库中字段的数据类型。在Django中,每个模型都是由字段构成的。这些字段描述了模型的属性,并指定了它们在数据库中的数据类型。Django提供了许多字段类型,包括文本字段、整数字段、日期字段、时间字段等。
玖叁叁
2023/04/23
1.2K0
TCP/IP四层模型和OSI七层模型
TCP/IP四层模型和OSI七层模型对应表。我们把OSI七层网络模型和LinuxTCP/IP四层概网络
Java架构师必看
2021/03/22
5830
如何有效地激活测试团队 ?
大家好,我是阿常,昨天测试职业成长+面试专项辅导社群主理人CC老师在视频号进行了第一场公开直播,直播时长1小时,观众总数415人。
程序媛淼淼
2022/12/20
3570

相似问题

数据访问层使用参数填充组合框

10

如何通过模型的wcf服务层访问数据注释

10

通用数据库模型的数据访问层设计

10

从数据层填充域模型,还是直接查询数据库?

24

如何有效地访问复杂核心数据模型中的数据

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文