CN104731911A - 一种数据表与实体类的动态映射及转换方法 - Google Patents
一种数据表与实体类的动态映射及转换方法 Download PDFInfo
- Publication number
- CN104731911A CN104731911A CN201510129831.3A CN201510129831A CN104731911A CN 104731911 A CN104731911 A CN 104731911A CN 201510129831 A CN201510129831 A CN 201510129831A CN 104731911 A CN104731911 A CN 104731911A
- Authority
- CN
- China
- Prior art keywords
- title
- row
- source
- destination object
- data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000013507 mapping Methods 0.000 title claims abstract description 52
- 238000000034 method Methods 0.000 title claims abstract description 28
- 238000006243 chemical reaction Methods 0.000 claims abstract description 21
- 230000008569 process Effects 0.000 claims abstract description 7
- 230000014509 gene expression Effects 0.000 claims description 35
- 239000012634 fragment Substances 0.000 claims description 18
- 238000010276 construction Methods 0.000 claims description 6
- 230000027455 binding Effects 0.000 description 4
- 238000009739 binding Methods 0.000 description 4
- 230000008901 benefit Effects 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 230000008676 import Effects 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 238000011161 development Methods 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000006870 function Effects 0.000 description 1
- 239000004615 ingredient Substances 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/28—Databases characterised by their database models, e.g. relational or object models
- G06F16/284—Relational databases
- G06F16/288—Entity relationship models
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种数据表与实体类的动态映射及转换方法,其具体实现过程为:构建源数据对象DataTable和目标数据对象实体间的映射关系描述字符串;从源数据对象DataTable进行数据抽取;把从源数据对象抽取的数据转换为目标数据对象实体。该一种数据表与实体类的动态映射及转换方法与现有技术相比,实现数据库中各种数据的快速抓取,实现各种数据的模式化展现,实用性强,易于推广。
Description
技术领域
本发明涉及数据处理技术领域,具体地说是一种实用性强、数据表与实体类的动态映射及转换方法。
背景技术
对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型***的数据之间的转换。一般需要事先构建源对象类型和目标对象类型,目标对象类型必须是强类型的或者硬编码,并且源对象类型和目标对象类型都要有一个比较复杂的Schema描述。
LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性。已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好处。
在实际开发过程中,我们的“业务逻辑”常常需要我们对同样的数据进行各种变换。例如,一个Web应用通过前端收集用户的输入成为数据传输对象(DTO),然后将DTO转换成领域模型并持久化到数据库中。另一方面,当用户请求数据时,我们又需要做相反的工作:将从数据库中查询出来的领域模型以相反的方式转换成DTO再呈现给用户。
每转换为一种实体类型,都需要手工编写转换代码,费时费力。
基于此,现提供一种基于字符串描述的数据表与实体类的动态映射及转换方法,该方法利用LINQ的特性,实现DTO和数据库表之间对象关系映射与转换的方案。
发明内容
本发明的技术任务是针对以上不足之处,提供一种实用性强、数据表与实体类的动态映射及转换方法。
一种数据表与实体类的动态映射及转换方法,其具体实现过程为:
一、构建源数据对象DataTable和目标数据对象实体间的映射关系描述字符串;
二、从源数据对象DataTable进行数据抽取;
三、把从源数据对象抽取的数据转换为目标数据对象实体。
所述步骤一中使用字符串类型描述映射关系的基本语法如下:
Fr["源对象列1名称"] to 目标对象属性1名称, Fr["源对象列2名称"] to 目标对象属性2名称,……, Fr["源对象列n名称"] to 目标对象属性n名称;
其中,Fr["源对象列1名称"] to 目标对象属性1名称,表示把源对象的某一列映射到目标对象的一个属性;Fr和to是固定关键词;源对象列1名称、源对象列2名称、源对象列n名称,代表源对象的某一列的列名称;目标对象属性1名称、目标对象属性2名称、目标对象属性n名称是目标对象的一个属性名称。
所述映射关系的具体描述语法为:
(Fr["源对象列m名称"] 运算符 Fr["源对象列n名称"]) to 目标对象属性名称;
其中,运算符包括“+”、“-”、“*”、“/”四种,当运算符前后的对象列的值为整数和数值类型时,使用以上四种运算符中的任何一个;当运算符前后的对象列的值为字符类型时,使用“+”运算符。
执行源数据对象与目标数据对象间的映射及转换时,首先要把映射关系描述字符串转换为符合Linq要求的Lambda表达式,即***把映射关系描述字符串中的每一个Fr["源对象列名称"] to 目标对象属性名称转换成一个Lambda表达式片段:
根据传入的目标对象实体的类型,动态构建目标对象实体类;当传入的目标对象实体的类型为null时,则动态构建一个dynamic类型的实体类;
当遇到关键词Fr,***根据其后的["源对象列n名称"],把其对应到列名称为“源对象列n名称”的数据上,并作为当前Lambda表达式片段的left段;
当遇到关键词to,***根据其后的“目标对象属性名称”,通过反射的方式获取目标对象实体中“目标对象属性名称”所代表的属性,并把该属性作为当前Lambda表达式片段的right段;
***根据Lambda表达式片段的right段所代表的目标对象属性的类型,把Lambda表达式片段的left段所代表的源对象列的值进行类型转换后,赋值给Lambda表达式片段的right段所代表的目标对象属性。
本发明的一种数据表与实体类的动态映射及转换方法,具有以下优点:
本发明提出的一种数据表与实体类的动态映射及转换方法,可以随时通过一个特定格式的字符串,描述源对象和目标对象实体间的映射关系,并快速的得到需要的对象实体,无需进行复杂的编码;利用这一特点,可以实现数据库中各种数据的快速抓取,并转换为展示所需要的对象实体,特别适合为MVC中的VierwModel层对象实体提供数据,在View确定的情况下,通过不同的配置,即可实现各种数据的模式化展现,实用性强,易于推广。
附图说明
附图1是本发明的映射及转换过程示意图。
具体实施方式
下面结合附图和具体实施例对本发明作进一步说明。
本发明公开了一种数据表与实体类的动态映射及转换方法,如附图1所示,其具体实现过程为:
一、构建源数据对象DataTable和目标数据对象实体间的映射关系描述字符串;
二、从源数据对象DataTable进行数据抽取;
三、把从源数据对象抽取的数据转换为目标数据对象实体。
使用字符串类型的映射关系描述来描述源数据对象与目标数据对象间的映射关系,其映射关系描述基本语法如下:
Fr["源对象列1名称"] to 目标对象属性1名称,Fr["源对象列2名称"] to 目标对象属性2名称,……, Fr["源对象列n名称"] to 目标对象属性n名称。
其中,Fr["源对象列1名称"] to 目标对象属性1名称,表示把源对象的某一列映射到目标对象的一个属性;Fr和to是固定关键词;源对象列1名称、源对象列2名称、源对象列n名称,代表源对象的某一列的列名称,根据源对象而定,非特指某一列;目标对象属性1名称、目标对象属性2名称、目标对象属性n名称是目标对象的一个属性名称,根据目标对象而定,非特指。
所述映射关系的具体描述语法为:
(Fr["源对象列m名称"] 运算符 Fr["源对象列n名称"]) to 目标对象属性名称;
其中,运算符包括“+”、“-”、“*”、“/”四种,当运算符前后的对象列的值为整数和数值类型时,使用以上四种运算符中的任何一个;当运算符前后的对象列的值为字符类型时,使用“+”运算符。
执行对象间的映射及转换时,首先要把映射关系描述字符串转换为符合Linq要求的Lambda表达式。
把映射关系描述字符串转换为符合Linq要求的Lambda表达式时,要根据传入的目标对象实体的类型,动态构建目标对象实体类;如果传入的目标对象实体的类型为null,则动态构建一个dynamic类型的实体类。
把映射关系描述字符串转换为符合Linq要求的Lambda表达式时, ***会把映射关系描述字符串中的每一个Fr["源对象列名称"] to 目标对象属性名称转换成一个Lambda表达式片段。
把映射关系描述字符串转换为符合Linq要求的Lambda表达式时,当遇到关键词Fr,实现本方法的***会根据其后的["源对象列n名称"],把其对应到列名称为“源对象列n名称”的数据上,并作为当前Lambda表达式片段的left段。
把映射关系描述字符串转换为符合Linq要求的Lambda表达式时,当遇到关键词to,实现本方法的***会根据其后的“目标对象属性名称”,通过反射的方式获取目标对象实体中“目标对象属性名称”所代表的属性,并把该属性作为当前Lambda表达式片段的right段。
把映射关系描述字符串转换为符合Linq要求的Lambda表达式时,***会根据Lambda表达式片段的right段所代表的目标对象属性的类型,把Lambda表达式片段的left段所代表的源对象列的值进行类型转换后,赋值给Lambda表达式片段的right段所代表的目标对象属性。
在上述步骤中,步骤二是进行数据抽取的实现,首先提供了一个接口,把目标对象类型、映射关系描述字符串传入,其入口方法实现如下:
public static IQueryable<TResult> Select<TResult>(this IQueryable source, string selector, params object[] values)
{
if (source == null) throw new ArgumentNullException("source");
if (selector == null) throw new ArgumentNullException("selector");
LambdaExpression lambda = DynamicExpression.ParseLambda(source.ElementType, typeof(TResult), selector, values);
return source.Provider.CreateQuery<TResult>(
Expression.Call(
typeof(Queryable), "Select",
new Type[] { source.ElementType, typeof(TResult) },
source.Expression, Expression.Quote(lambda)));
}
其中,TResult是目标对象类型,如果没有确定的类型,可以传入Object,***将映射为dynamic类型;selector是传入的映射关系描述字符串。
接下来将***将分析传入的映射关系描述字符串,以空格为分析基础,找出其中的每一个关键字,进而转换为表单式,最后通过Linq的功能,执行表达式树,将DataTable转换为目标对象实体,其中转换为目标对象实体关键代码如下:
Type type = newResultType ?? DynamicExpression.CreateClass(properties);
MemberBinding[] bindings = new MemberBinding[properties.Count];
for (int i = 0; i < bindings.Length; i++)
bindings[i] = Expression.Bind(type.GetProperty(properties[i].Name), expressions[i]);
return Expression.MemberInit(Expression.New(type), bindings)。
其中newResultType是目标对象实体类型。
实施例:本发明的最终实现是一个.NET环境下的DLL,在使用时,有如下步骤:
第一步:先在代码工程中引用本DLL,并在相关的类中添加命名空间INSPUR.Dynamic.AutoMap;
第二步:在合适的代码位置,根据目对象类型和源对象类型,构建字符串表单式,如:
Fr["LastName "] to UserName, Fr["EmployeeID "] to UserID
第三步:调用 方法Select<TResult>,如:
var users = dt.AsEnumerable()
.AsQueryable()
.Select<User>("Fr[\"LastName\"] to UserName,
Fr [\"EmployeeID\"] to UserID");
上面代码中,dt是源对象数据表DataTable,User是目标对象实体类,"Fr[\"LastName\"] to UserName, Fr [\"EmployeeID\"] to UserID"是字符串映射关系表达式,由于内外都有双引号,因此内部做了转义处理。
通过以上三步,就完成了数据表到对象实体的映射和转换,方便快捷。
上述具体实施方式仅是本发明的具体个案,本发明的专利保护范围包括但不限于上述具体实施方式,任何符合本发明的一种数据表与实体类的动态映射及转换方法的权利要求书的且任何所述技术领域的普通技术人员对其所做的适当变化或替换,皆应落入本发明的专利保护范围。
Claims (4)
1.一种数据表与实体类的动态映射及转换方法,其特征在于,其具体实现过程为:
一、构建源数据对象DataTable和目标数据对象实体间的映射关系描述字符串;
二、从源数据对象DataTable进行数据抽取;
三、把从源数据对象抽取的数据转换为目标数据对象实体。
2.根据权利要求1所述的一种数据表与实体类的动态映射及转换方法,其特征在于,所述步骤一中使用字符串类型描述映射关系的基本语法如下:
Fr["源对象列1名称"] to 目标对象属性1名称, Fr["源对象列2名称"] to 目标对象属性2名称,……, Fr["源对象列n名称"] to 目标对象属性n名称;
其中,Fr["源对象列1名称"] to 目标对象属性1名称,表示把源对象的某一列映射到目标对象的一个属性;Fr和to是固定关键词;源对象列1名称、源对象列2名称、源对象列n名称,代表源对象的某一列的列名称;目标对象属性1名称、目标对象属性2名称、目标对象属性n名称是目标对象的一个属性名称。
3.根据权利要求2所述的一种数据表与实体类的动态映射及转换方法,其特征在于,所述映射关系的具体描述语法为:
(Fr["源对象列m名称"] 运算符 Fr["源对象列n名称"]) to 目标对象属性名称;
其中,运算符包括“+”、“-”、“*”、“/”四种,当运算符前后的对象列的值为整数和数值类型时,使用以上四种运算符中的任何一个;当运算符前后的对象列的值为字符类型时,使用“+”运算符。
4.根据权利要求1-3任一所述的一种数据表与实体类的动态映射及转换方法,其特征在于,执行源数据对象与目标数据对象间的映射及转换时,首先要把映射关系描述字符串转换为符合Linq要求的Lambda表达式,即***把映射关系描述字符串中的每一个Fr["源对象列名称"] to 目标对象属性名称转换成一个Lambda表达式片段:
根据传入的目标对象实体的类型,动态构建目标对象实体类;当传入的目标对象实体的类型为null时,则动态构建一个dynamic类型的实体类;
当遇到关键词Fr,***根据其后的["源对象列n名称"],把其对应到列名称为“源对象列n名称”的数据上,并作为当前Lambda表达式片段的left段;
当遇到关键词to,***根据其后的“目标对象属性名称”,通过反射的方式获取目标对象实体中“目标对象属性名称”所代表的属性,并把该属性作为当前Lambda表达式片段的right段;
***根据Lambda表达式片段的right段所代表的目标对象属性的类型,把Lambda表达式片段的left段所代表的源对象列的值进行类型转换后,赋值给Lambda表达式片段的right段所代表的目标对象属性。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510129831.3A CN104731911A (zh) | 2015-03-24 | 2015-03-24 | 一种数据表与实体类的动态映射及转换方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510129831.3A CN104731911A (zh) | 2015-03-24 | 2015-03-24 | 一种数据表与实体类的动态映射及转换方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN104731911A true CN104731911A (zh) | 2015-06-24 |
Family
ID=53455798
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510129831.3A Pending CN104731911A (zh) | 2015-03-24 | 2015-03-24 | 一种数据表与实体类的动态映射及转换方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104731911A (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105550242A (zh) * | 2015-12-08 | 2016-05-04 | 方正移动传媒技术(北京)有限公司 | 关系数据库数据处理方法及装置 |
CN106843872A (zh) * | 2017-01-17 | 2017-06-13 | 千寻位置网络有限公司 | 赋值转换方法 |
CN106933554A (zh) * | 2015-12-30 | 2017-07-07 | 北京国双科技有限公司 | 类转换方法和装置 |
CN106951427A (zh) * | 2016-01-07 | 2017-07-14 | 阿里巴巴集团控股有限公司 | 一种业务对象的数据抽取方法及装置 |
CN108153655A (zh) * | 2017-12-18 | 2018-06-12 | 福建天晴数码有限公司 | 虚拟现实软件的绘制调用数量的检测方法及存储介质 |
CN109901822A (zh) * | 2019-01-08 | 2019-06-18 | 平安科技(深圳)有限公司 | 对象互转方法、装置及存储介质、服务器 |
CN113110847A (zh) * | 2021-04-29 | 2021-07-13 | 杭州以诺行汽车科技股份有限公司 | 一种程序代码的转换处理方法及*** |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050050068A1 (en) * | 2003-08-29 | 2005-03-03 | Alexander Vaschillo | Mapping architecture for arbitrary data models |
CN1647080A (zh) * | 2002-04-25 | 2005-07-27 | 国际商业机器公司 | 多数据库环境中存取数据的方法、计算机程序和计算机 |
CN101008952A (zh) * | 2007-01-30 | 2007-08-01 | 华为技术有限公司 | 一种持久层生成方法及装置 |
CN101405729A (zh) * | 2006-03-23 | 2009-04-08 | 微软公司 | 具有增量式视图维护的映射体系结构 |
-
2015
- 2015-03-24 CN CN201510129831.3A patent/CN104731911A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1647080A (zh) * | 2002-04-25 | 2005-07-27 | 国际商业机器公司 | 多数据库环境中存取数据的方法、计算机程序和计算机 |
US20050050068A1 (en) * | 2003-08-29 | 2005-03-03 | Alexander Vaschillo | Mapping architecture for arbitrary data models |
CN101405729A (zh) * | 2006-03-23 | 2009-04-08 | 微软公司 | 具有增量式视图维护的映射体系结构 |
CN101008952A (zh) * | 2007-01-30 | 2007-08-01 | 华为技术有限公司 | 一种持久层生成方法及装置 |
Non-Patent Citations (3)
Title |
---|
夏树立: "《基于对象关系映射技术的数据持久层的研究与应用》", 《中国优秀硕士学位论文全文数据库 信息科技辑》 * |
王振杰: "《基于LINQ的B_S开发架构的设计与应用》", 《中国优秀硕士学位论文全文数据库 信息科技辑》 * |
蒋冠雄 等: "《一种支持模糊查询的LINQ动态查询方案》", 《计算机时代》 * |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105550242A (zh) * | 2015-12-08 | 2016-05-04 | 方正移动传媒技术(北京)有限公司 | 关系数据库数据处理方法及装置 |
CN106933554A (zh) * | 2015-12-30 | 2017-07-07 | 北京国双科技有限公司 | 类转换方法和装置 |
CN106951427A (zh) * | 2016-01-07 | 2017-07-14 | 阿里巴巴集团控股有限公司 | 一种业务对象的数据抽取方法及装置 |
CN106951427B (zh) * | 2016-01-07 | 2020-08-18 | 阿里巴巴集团控股有限公司 | 一种业务对象的数据抽取方法及装置 |
CN106843872A (zh) * | 2017-01-17 | 2017-06-13 | 千寻位置网络有限公司 | 赋值转换方法 |
CN108153655A (zh) * | 2017-12-18 | 2018-06-12 | 福建天晴数码有限公司 | 虚拟现实软件的绘制调用数量的检测方法及存储介质 |
CN109901822A (zh) * | 2019-01-08 | 2019-06-18 | 平安科技(深圳)有限公司 | 对象互转方法、装置及存储介质、服务器 |
WO2020143306A1 (zh) * | 2019-01-08 | 2020-07-16 | 平安科技(深圳)有限公司 | 对象互转方法、装置及存储介质、服务器 |
CN113110847A (zh) * | 2021-04-29 | 2021-07-13 | 杭州以诺行汽车科技股份有限公司 | 一种程序代码的转换处理方法及*** |
CN113110847B (zh) * | 2021-04-29 | 2024-02-13 | 杭州以诺行汽车科技股份有限公司 | 一种程序代码的转换处理方法及*** |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104731911A (zh) | 一种数据表与实体类的动态映射及转换方法 | |
Astrova et al. | Storing OWL ontologies in SQL relational databases | |
US8103705B2 (en) | System and method for storing text annotations with associated type information in a structured data store | |
CN103744891B (zh) | 一种数据查询方法和*** | |
US8983931B2 (en) | Index-based evaluation of path-based queries | |
CN104866593A (zh) | 一种基于知识图谱的数据库搜索方法 | |
CN106407201A (zh) | 一种数据处理方法及装置 | |
Raffio et al. | Clip: a visual language for explicit schema mappings | |
CN101841515A (zh) | 可变目标的协议数据单元编解码代码自动生成的实现方法 | |
CN107491476B (zh) | 一种适用于多种大数据管理***的数据模型转换及查询分析方法 | |
CN104601554B (zh) | 一种数据交换方法及数据交换装置 | |
Čerāns et al. | Rdb2owl: A RDB-to-RDF/OWL mapping specification language | |
Fahad | Er2owl: Generating owl ontology from er diagram | |
US20060161525A1 (en) | Method and system for supporting structured aggregation operations on semi-structured data | |
CN103186455A (zh) | 页面自动化测试脚本生成方法及*** | |
CN103020318A (zh) | 一种对数据库中数据库表维护的方法 | |
CN103678396B (zh) | 一种基于数据模型的数据备份方法和装置 | |
CN103902651B (zh) | 一种基于MongoDB的云端代码查询方法与装置 | |
CN1211746C (zh) | 嵌入式***与外部数据库进行数据交换的方法 | |
Shen et al. | A graph-based RDF triple store | |
Fisher et al. | Use of OWL and SWRL for Semantic Relational Database Translation. | |
Alaoui et al. | Automatic Mapping of Relational Databases to OWL Antology | |
World Wide Web Consortium | R2RML: RDB to RDF mapping language | |
CN109683952B (zh) | 数据集组装框架的确定方法及*** | |
Zhang et al. | The query and application of XML data based on XQuery |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20150624 |
|
WD01 | Invention patent application deemed withdrawn after publication |