【积累】LinqToSql复合查询结果转DataTable数据
最近的项目用到了大量的复合查询结果用于数据源,绑定到数据控件上。
为了方便,我们把它转换成DataTable的数据源形式。请看下面的示例:
1)思考自己需要的数据,然后组合,因此创建一个新的类:
/// <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 命名空间引用):
/// <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:
/// <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;
}
介绍完毕。
这个方法是我新学到的,拿出来给那些没有接触过的程序猿看看,也方便自己查找。
喜欢就收藏下吧,哈哈,我文笔不行,如果大家有不明白的地方可以交流。
^_^
【积累】LinqToSql复合查询结果转DataTable数据的更多相关文章
- DataTable数据转换为实体
我们在用三层架构编写软件时,常常会遇到例如以下问题,就是三层之间的參数传递问题:假设我们在D层查询出数据是DataTable类型的,那么我们在B层甚至U层使用这条数据时,就要用DataTable类型来 ...
- 关于SQL查询效率,100w数据,查询只要1秒
1.关于SQL查询效率,100w数据,查询只要1秒,与您分享:机器情况p4: 2.4内存: 1 Gos: windows 2003数据库: ms sql server 2000目的: 查询性能测试,比 ...
- Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询
HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了 ...
- linq根据传入数据集合查询对应子级数据
工作中经常用到的linq根据传入数据集合查询对应子级数据,整理共享,希望大家都能用得上,代码中doublesArray 为父节点对应ID数据集合,再根据ID数据集合查询全部子级数据. //获取缓存数据 ...
- EF 查询视图出现重复数据
解决方案: 由多张表组成的视图,要加实体键.而且实体键组合要能确保唯一性. 个人理解:确保唯一性,一个或多个实体键,实现了复合主键或组合主键的效果. 这样查询是,延迟加载机制,才知道哪些需要重新从数据 ...
- linq依据传入数据集合查询相应子级数据
工作中经经常使用到的linq依据传入数据集合查询相应子级数据,整理共享,希望大家都能用得上,代码中doublesArray 为父节点相应ID数据集合,再依据ID数据集合查询所有子级数据. //获取缓存 ...
- bootstrap datatable 数据刷新问题
在项目中,页面初始化的时候,通过通过向后台请求数据,页面初始化完之后,datatable是有数据的,当我点击页面的搜索按钮(按照时间过滤数据),datatable的数据要能重新刷新或者重载:这一点,我 ...
- Elasticsearch(7) --- 复合查询
Elasticsearch(7) ---复合查询 复合查询有:bool query(布尔查询).boosting query(提高查询).constant_score(固定分数查询).dis_max( ...
- Es学习第九课, 聚合查询和复合查询
ES除了实现前几课的基本查询,也可以实现类似关系型数据库的聚合查询,如平均值sum.最小值min.最大值max等等 我们就用上一课的数据作为参考来举例 聚合查询 sum聚合 sum是一个求累加值的聚合 ...
随机推荐
- 使用unity3D生成项目(Easy Movie Texture)运行出现的问题
运行后,首先报的错需要改 -fno-objc-arc 编译后出现的新的错. 需要将 CustomVideoPlayer.mm _lastFrameTimestamp = _curFrameT ...
- flex布局——回顾
flex 即为弹性布局. 任何一个容器都可以指定为flex布局. .box{display:flex} 行内元素可以使用flex布局 .box{display: inline-flex} webkit ...
- 小a的强迫症(组合数学)
问题描述: 小a是一名强迫症患者,现在他要给一群带颜色的珠子排成一列,现在有N种颜色,其中第i种颜色的柱子有num(i)个.要求排列中第i种颜色珠子的最后一个珠子,一定要排在第i+1种颜色的最后一个珠 ...
- MySql Connector/C++8简介
MySql Connector/C++8是一个用于连接MySQL服务器的C++应用程序.Connector/C++8可用于访问实现文档存储的 MySQL服务器,或者使用SQL查询以传统方式访问.它支持 ...
- WebMagic 启动例子报错
报错内容: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/conn/Http ...
- git 本地分支与远程仓库分支关联
当我们从远程仓库项目克隆到本地后,会自动创建本地master分支,并且与远程仓库主分支关联.如果我们需要在本地创建一个分支并且与远程仓库的origin/xxx分支关联,则可以通过以下命令实现 git ...
- CentOS7版本基础使用
第1章 CentOS7的使用 1.1 为什么要使用CentOS7版本 CentOS7是在CentOS6基础上发布的新版本,与之前的版本相比,主要的更新包括: 1.内核更新到3.10.0 2.支持Lin ...
- 迷你MyBank
该迷你MyBank,存贮是用对象数组来存贮的,所以比较简单,容易理解,适合新手.. 一.创建chengyuan类,在其中声明所需的成员变量: public class chengyuan { //该类 ...
- 【BGP的基本配置】
BGP的基本配置 一:根据项目需求搭建好拓扑图如下 二:配置 1:首先进行理论分析:RT1和RT2,3分别属于不同的AS;在RT1和RT2之间建立EBGP关系,在确保RT3可以学到RT1的8.1.1. ...
- 总结laravel假数据填充步骤
定义好模型 xxx.php 定义好数据生成的规则 database/factories/XxxlFactory.php 写入生成数据的代码,控制好生成的数据数目,对生成后的数据做出修改 databas ...