【积累】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是一个求累加值的聚合 ...
随机推荐
- Oracle 手工创建awr快照,获取报告
Oracle 的自动化工具都是通过后台的进程调用相关的函数实现,而Oracle也允许用户通过包来手工调用这些函数,显然这样增加了工具的安全性,也提高了可操作性,使得DBA可以更灵活的使用这些函数来满足 ...
- Mybaties保存后自动获取主键ID
<!-- 插入记录 --> <insert id="saveTvTypeBatch" useGeneratedKeys="true" keyP ...
- Java中的文件和stream流的操作代码
1.Java中FileRead方法的运用代码及详解 package example2;import java.io.FileReader;import java.io.IOException;clas ...
- 渗透测试实验(i春秋 真的很简单)
首先利用给的提示: 所以用户名是 ichunqiu 密码是adab29e084ff095ce3eb 可以确定一般密码都是md5的,但是这个20位 应该去掉ada b29e084ff095ce3e才是正 ...
- Linux 控制台
shell shell命令分为两种:分别是内部命令和外部命令. 内部命令:在安装的时候嵌入系统内核. 外部命令:以文件的形式存在. 可以使用type命令查看是内部命令还是外部命令. Linux中,默认 ...
- (数据科学学习手札03)Python与R在随机数生成上的异同
随机数的使用是很多算法的关键步骤,例如蒙特卡洛法.遗传算法中的轮盘赌法的过程,因此对于任意一种语言,掌握其各类型随机数生成的方法至关重要,Python与R在随机数底层生成上都依靠梅森旋转(twiste ...
- 使用maven插件生成grpc所需要的Java代码
1.首先需要编写自己需要的.proto文件,本文重点不在这里,.proto可以参考grpc官方例子 https://grpc.io/docs/quickstart/java.html 2.创建自己的J ...
- namenode处于安全模式怎么解决?
当我们在hdfs上操作文件的时候,有时候会报错 ,出现namenode in safemode namenode处于安全模式的原因: 1.NameNode发现集群中DataNode丢失达到一定 ...
- 在Go语言里检测内存泄漏
我们先来设定一下数据库,建立一个MySQL数据库表,名为users,里面有login_name.nickname.uid.password.forbidden几个字段,其中uid与forbidden为 ...
- NSOperation那点事儿
1. NSOperation.NSOperationQueue 简介 NSOperation.NSOperationQueue 是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.N ...