【积累】LinqToSql复合查询结果转DataTable数据
最近的项目用到了大量的复合查询结果用于数据源,绑定到数据控件上。
为了方便,我们把它转换成DataTable的数据源形式。请看下面的示例:
1)思考自己需要的数据,然后组合,因此创建一个新的类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /// <summary> /// the DTO for role group mapping /// </summary> public class GroupByRole { /// <summary> /// this Id /// </summary> public int Id { get ; set ; } /// <summary> /// this SFGroupCode /// </summary> public string SFGroupCode { get ; set ; } /// <summary> /// this ParentFunctionId /// </summary> public int RoleId { get ; set ; } /// <summary> /// this DisplayDescription /// </summary> public string DisplayDescription { get ; set ; } /// <summary> /// this SFGroupName /// </summary> public string SFGroupName { get ; set ; } /// <summary> /// this IsDefaultFunction /// </summary> public bool IsReadable { get ; set ; } /// <summary> /// this FunctionType /// </summary> public bool IsEditable { get ; set ; } } |
上面的类就是 我需要的 所以表的数据集合。
2)下面的方法是类转表的方法(需要添加 System.Reflection 命名空间引用):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | /// <summary> /// get a empty datatable by a object /// </summary> /// <param name="dataType"></param> /// <returns></returns> [System.Diagnostics.CodeAnalysis.SuppressMessage( "Microsoft.Reliability" , "CA2000:Dispose objects before losing scope" )] protected static DataTable GetDataTableSchema(Type dataType) { if (dataType == null ) throw new ArgumentNullException( "dataType" ); DataTable dt = new DataTable(); dt.Locale = System.Globalization.CultureInfo.InvariantCulture; Type tType = dataType; PropertyInfo[] propertys = tType.GetProperties(); for ( int i = 0; i < propertys.Length; i++) { string columnName = propertys[i].Name; if (!dt.Columns.Contains(columnName)) { dt.Columns.Add(columnName); } } return dt; } |
3)下面的方法就是用Linqtosql语法查询出来的结果,并且调用 2)的方法转成DataTable:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | /// <summary> /// get Role Group Mapping /// </summary> /// <param name="roleId"></param> /// <returns></returns> public DataTable GetRoleGroupMappingByRole( int roleId) { //用于查询的源数据 IList<SFGroup> groups = SFGroupService.ActiveSFGroups(); IList<SecurityRole> roles = SecurityRoleService.ActiveRoles(); IList<SecurityRoleSFGroupMapping> roleGroups = RoleSFGroupRightsManagementService.GetActiveGroups(); //复合查询结果集 var result = from mapp in roleGroups join srole in roles on mapp.RoleId equals srole.Id join sfgroup in groups on mapp.SFGroupCode equals sfgroup.SFGroupCode where srole.Id == roleId select new { mapp.Id, mapp.SFGroupCode, sfgroup.SFGroupName, mapp.RoleId, srole.DisplayDescription, mapp.IsEditable, mapp.IsReadable }; //创建table空模板 DataTable dt = GetDataTableSchema( typeof (GroupByRole)); //把结果转成table数据形式 foreach ( var rfm in result) { DataRow dr = dt.NewRow(); DataColumnCollection dcl = dt.Columns; foreach (DataColumn dc in dcl) { dr[dc.ColumnName] = rfm.GetType().GetProperty(dc.ColumnName).GetValue(rfm, null ); } dt.Rows.Add(dr); } return dt; } |
介绍完毕。
这个方法是我新学到的,拿出来给那些没有接触过的程序猿看看,也方便自己查找。
喜欢就收藏下吧,哈哈,我文笔不行,如果大家有不明白的地方可以交流。
^_^
漫漫人生,唯有激流勇进,不畏艰险,奋力拼搏,方能中流击水,抵达光明的彼岸
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App