最近的项目用到了大量的复合查询结果用于数据源,绑定到数据控件上。

为了方便,我们把它转换成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数据的更多相关文章

  1. DataTable数据转换为实体

    我们在用三层架构编写软件时,常常会遇到例如以下问题,就是三层之间的參数传递问题:假设我们在D层查询出数据是DataTable类型的,那么我们在B层甚至U层使用这条数据时,就要用DataTable类型来 ...

  2. 关于SQL查询效率,100w数据,查询只要1秒

    1.关于SQL查询效率,100w数据,查询只要1秒,与您分享:机器情况p4: 2.4内存: 1 Gos: windows 2003数据库: ms sql server 2000目的: 查询性能测试,比 ...

  3. Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询

    HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了 ...

  4. linq根据传入数据集合查询对应子级数据

    工作中经常用到的linq根据传入数据集合查询对应子级数据,整理共享,希望大家都能用得上,代码中doublesArray 为父节点对应ID数据集合,再根据ID数据集合查询全部子级数据. //获取缓存数据 ...

  5. EF 查询视图出现重复数据

    解决方案: 由多张表组成的视图,要加实体键.而且实体键组合要能确保唯一性. 个人理解:确保唯一性,一个或多个实体键,实现了复合主键或组合主键的效果. 这样查询是,延迟加载机制,才知道哪些需要重新从数据 ...

  6. linq依据传入数据集合查询相应子级数据

    工作中经经常使用到的linq依据传入数据集合查询相应子级数据,整理共享,希望大家都能用得上,代码中doublesArray 为父节点相应ID数据集合,再依据ID数据集合查询所有子级数据. //获取缓存 ...

  7. bootstrap datatable 数据刷新问题

    在项目中,页面初始化的时候,通过通过向后台请求数据,页面初始化完之后,datatable是有数据的,当我点击页面的搜索按钮(按照时间过滤数据),datatable的数据要能重新刷新或者重载:这一点,我 ...

  8. Elasticsearch(7) --- 复合查询

    Elasticsearch(7) ---复合查询 复合查询有:bool query(布尔查询).boosting query(提高查询).constant_score(固定分数查询).dis_max( ...

  9. Es学习第九课, 聚合查询和复合查询

    ES除了实现前几课的基本查询,也可以实现类似关系型数据库的聚合查询,如平均值sum.最小值min.最大值max等等 我们就用上一课的数据作为参考来举例 聚合查询 sum聚合 sum是一个求累加值的聚合 ...

随机推荐

  1. 使用unity3D生成项目(Easy Movie Texture)运行出现的问题

    运行后,首先报的错需要改  -fno-objc-arc 编译后出现的新的错.   需要将   CustomVideoPlayer.mm _lastFrameTimestamp = _curFrameT ...

  2. flex布局——回顾

    flex 即为弹性布局. 任何一个容器都可以指定为flex布局. .box{display:flex} 行内元素可以使用flex布局 .box{display: inline-flex} webkit ...

  3. 小a的强迫症(组合数学)

    问题描述: 小a是一名强迫症患者,现在他要给一群带颜色的珠子排成一列,现在有N种颜色,其中第i种颜色的柱子有num(i)个.要求排列中第i种颜色珠子的最后一个珠子,一定要排在第i+1种颜色的最后一个珠 ...

  4. MySql Connector/C++8简介

    MySql Connector/C++8是一个用于连接MySQL服务器的C++应用程序.Connector/C++8可用于访问实现文档存储的 MySQL服务器,或者使用SQL查询以传统方式访问.它支持 ...

  5. WebMagic 启动例子报错

    报错内容: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/conn/Http ...

  6. git 本地分支与远程仓库分支关联

    当我们从远程仓库项目克隆到本地后,会自动创建本地master分支,并且与远程仓库主分支关联.如果我们需要在本地创建一个分支并且与远程仓库的origin/xxx分支关联,则可以通过以下命令实现 git ...

  7. CentOS7版本基础使用

    第1章 CentOS7的使用 1.1 为什么要使用CentOS7版本 CentOS7是在CentOS6基础上发布的新版本,与之前的版本相比,主要的更新包括: 1.内核更新到3.10.0 2.支持Lin ...

  8. 迷你MyBank

    该迷你MyBank,存贮是用对象数组来存贮的,所以比较简单,容易理解,适合新手.. 一.创建chengyuan类,在其中声明所需的成员变量: public class chengyuan { //该类 ...

  9. 【BGP的基本配置】

    BGP的基本配置 一:根据项目需求搭建好拓扑图如下 二:配置 1:首先进行理论分析:RT1和RT2,3分别属于不同的AS;在RT1和RT2之间建立EBGP关系,在确保RT3可以学到RT1的8.1.1. ...

  10. 总结laravel假数据填充步骤

    定义好模型 xxx.php 定义好数据生成的规则 database/factories/XxxlFactory.php 写入生成数据的代码,控制好生成的数据数目,对生成后的数据做出修改 databas ...