注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

午夜阳光

 
 
 

日志

 
 

【积累】LinqToSql复合查询结果转DataTable数据  

2015-01-15 12:18:20|  分类: Linq |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

     为了方便,我们把它转换成DataTable的数据源形式。请看下面的示例:

     1)思考自己需要的数据,然后组合,因此创建一个新的类:

/// <summary>
/// the DTO for role group mapping
/// </summary>
public class GroupByRole
{
    /// <summary>
    /// this Id
    /// </summary>
    public int Id { getset; }
    /// <summary>
    /// this SFGroupCode
    /// </summary>
    public string SFGroupCode { getset; }
    /// <summary>
    /// this ParentFunctionId
    /// </summary>
    public int RoleId { getset; }
    /// <summary>
    /// this DisplayDescription
    /// </summary>
    public string DisplayDescription { getset; }
    /// <summary>
    /// this SFGroupName
    /// </summary>
    public string SFGroupName { getset; }
    /// <summary>
    /// this IsDefaultFunction
    /// </summary>
    public bool IsReadable { getset; }
    /// <summary>
    /// this FunctionType
    /// </summary>
    public bool IsEditable { getset; }
}

上面的类就是 我需要的 所以表的数据集合。

 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 == nullthrow 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;
}
  评论这张
 
阅读(61)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017