动态绑定ReportViewer虽然之前实现过,但现在弄起来还是有点晕,主要是过去没有使用Linq,数据的操作经常用到DataTable,可以直接拿来使用,现在用Linq更方便,也懒得再用之前的数据库连接方式,幸好,最后发现了这篇文章,将linq和datatable连接了起来,因此,我有了前一篇文章和这篇文章这两大法宝,现在可以轻松搞定动态查询生成报表了,不知道网上有没有使用同样方法的人~~~~~

在使用LINQ查询的时候,一般我们会返回List<T>或IList<T>类型,如下所示:

例1:

public List<TSample> GetList()

{

using (BPDataContext db = newBPDataContext(TCTC_ConnectionStrings.connStr))

{

var q = from p in db.TSample

select p;

return q.ToList();

}

}

例1实现的是一个最简单的列表查询,返回的是List<TSample>类型,本身没有任何问题!但是如果现在希望查询TSample表中的指定几列,代码应该是:

var q = from p in db.TSample

select new

{

p.FID,

p.FName

};

return q.ToList();

现在问题是返回类型该写什么呢?new{p.FID,p.FName}已经不是TSample类型了,又不支持返回值为List<T>的!

可能的解决方案是:

方法一:

先扩展一个类SampleEx

public class SampleEx

{

public Guid FID

{

get;

set;

}

public string FName

{

get;

set;

}

}

然后返回List<SampleEx>类型

public List<SampleEx> GetList()

{

using (BPDataContext db = newBPDataContext(TCTC_ConnectionStrings.connStr))

{

var q = from p in db.TSample

select new SampleEx()

{

FID = p.FID,

FName = p.FName

};

return q.ToList();

}

}

这样就达到了我们想要的目标。

问题是解决了,但是再仔细想想这样的解决方案似乎可行性不强。因为在实际开发中我们经常查询两个表join查询,那么重新组合的字段就比较多了,要每个都去扩展单独的类,工作量太大!有些人可能会想到用试图,然后dbml会自动帮我们生成类,但是这个工作量也应该不小,天天建试图,要频繁跟新dbml文件的方式不怎么合理!最期望的方式就是不用构造自定义类型,经过转换返回我们需要的类型!

下面通过一个方法来实现返回DataTable类型:

/// <summary>

/// LINQ返回DataTable类型

/// </summary>

/// <typeparam name="T"> </typeparam>

/// <param name="varlist"> </param>

/// <returns> </returns>

public static DataTable ToDataTable<T>(IEnumerable<T> varlist)

{

DataTable dtReturn = new DataTable();

// column names

PropertyInfo[] oProps = null;

if (varlist == null)

return dtReturn;

foreach (T rec in varlist)

{

if (oProps == null)

{

oProps = ((Type)rec.GetType()).GetProperties();

foreach (PropertyInfo pi in oProps)

{

Type colType = pi.PropertyType;

if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()

== typeof(Nullable<>)))

{

colType = colType.GetGenericArguments()[0];

}

dtReturn.Columns.Add(new DataColumn(pi.Name,colType));

}

}

DataRow dr = dtReturn.NewRow();

foreach (PropertyInfo pi in oProps)

{

dr[pi.Name] = pi.GetValue(rec, null) == null ?DBNull.Value : pi.GetValue

(rec, null);

}

dtReturn.Rows.Add(dr);

}

return dtReturn;

}

如何使用?如下示例:

/// <summary>

/// 根据获取多个器具信息

/// </summary>

/// <param name="IDs"></param>

/// <returns></returns>

public DataTable GetByIDs(List<string> IDs)

{

using (BPDataContext db = newBPDataContext(TCTC_ConnectionStrings.connStr))

{

var p = (from c in db.TSample

where IDs.Contains(c.FID.ToString())

select new

{

c.FID,

c.FName,

c.FCode,

c.FType,

c.FProductUnit,

c.FDeviceNo

}).ToList();

return LinqToDataTable.ToDataTable(p);

}

}

到这里就达到了我们预期的方式!返回DataTable,那么对后面数据源直接绑定,或序列化为Json都非常方便了!

序列化DataTable为Json格式的方法直接用微软的JavaScriptSerializer.Serialize()方法是会有问题的,我们需要自己写方法序列化,

序列化代码详见:http://xuzhihong1987.blog.163.com/blog/static/26731587201101913722238/

飞天心宏  2011-01-19

转:LINQ查询返回DataTable类型的更多相关文章

  1. LINQ查询返回DataTable类型

    个人感觉Linq实用灵活性很大,参考一篇大牛的文章LINQ查询返回DataTable类型 http://xuzhihong1987.blog.163.com/blog/static/267315872 ...

  2. LINQ查询返回DataTable类型[轉]與将DataTable序列化为Json格式【轉】

    (原文地址:http://xuzhihong1987.blog.163.com/blog/static/26731587201101853740294/) LINQ查询返回DataTable类型 在使 ...

  3. LINQ返回DataTable类型 list转dataset 转换为JSON对象

    using System.Web.Script.Serialization; using System.Collections.Generic; using System.Reflection; us ...

  4. .NET LINQ查询操作中的类型关系

    LINQ 查询操作中的类型关系      若要有效编写查询,您应该了解完整的查询操作中的变量类型是如何全部彼此关联的. 如果您了解这些关系,就能够更容易地理解文档中的 LINQ 示例和代码示例. 另外 ...

  5. Hibernate应用SQL查询返回实体类型

    Hibernate应用SQL查询返回实体类型 Hibernate使用SQL查询返回实体类型 以前,使用SQL查询,结果放在 RS 结果集中,还要去转换影射到Java类中.Hibernate中,可以自动 ...

  6. 把Linq查询返回的var类型的数据 转换为DataTable EF连接查询

    问题:我要获得一个角色下对应的所有用户,需要两表连接查询,虽然返回的只有用户数据,但是我想到若是返回的不只是用户数据,而还要加上角色信息,那么我返回什么类型呢,返回var吗,这样不行. 于是我网上找找 ...

  7. C#3.0新增功能09 LINQ 基础06 LINQ 查询操作中的类型关系

    连载目录    [已更新最新开发文章,点击查看详细] 若要有效编写查询,应了解完整的查询操作中的变量类型是如何全部彼此关联的. 如果了解这些关系,就能够更容易地理解文档中的 LINQ 示例和代码示例. ...

  8. HQL查询——查询返回对象类型分析

    关于HQL查询,我们可以结合hibernate的API文档,重点围绕org.hibernate.Query接口,分析其方法,此接口的实例对象是通过通过session.对象的creatQuery(Str ...

  9. Dapper查询返回Datatable

    dapper封装的扩展方法中,没有直接返回datatable的方法,项目中有些时候需要用到这样的返回格式,而为了项目数据框架的统一性, 不好直接用其他框架,如果直接将查询出来的泛型集合转datatab ...

随机推荐

  1. 给Select赋值 innerHTML 不兼容IE6\IE7\IE8\IE9

    <select class="b-select" id="location-province" name="Province" def ...

  2. 方案:抵御 不明SSL证书导致的 中间人攻击

    基于SSL数字证书的中间人攻击已经不是一个新技术了,但是我发现很多人并不清楚这种威胁,甚至感觉无所谓,我相信他们是由于短暂的无知蒙蔽了双眼,希望这篇文章可以让更多的人知道这种攻击方式,并清除这种网络威 ...

  3. Java宝典(二)

    --String s = "a" + "b" + "c" + "d"; 一共创建了多少个对象? --对于如下代码: St ...

  4. softlayerFastUploadVHDtoBS

    Object Storage Uploader Overview We’ve recently added the option to import customer-supplied Virtual ...

  5. Python与MySQL首次交互

    前两天在工作之余研究了一下Python,对基础有了大致了解,就想拿她很MqSQL交互一下. 一开始就遇到了问题,要import MySQLdb,search发现有人说安装mysql-python,于是 ...

  6. 汉字与utf8相互转化

    NSString* strA = [@"%E4%B8%AD%E5%9B%BD"stringByReplacingPercentEscapesUsingEncoding:NSUTF8 ...

  7. redis实现spring-data-redis整合

    java之redis篇(spring-data-redis整合)  博客链接网址:http://www.cnblogs.com/yjmyzz/tag/redis/ redis的知识:官网 1,利用sp ...

  8. [WebGL入门]十九,遮挡剔除和深度測试

    注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外.鄙人webgl研究还不够深入,一些专业词语,假设翻译有误.欢迎大家指 ...

  9. [每日一题] OCP1z0-047 :2013-08-17 EXTERNAL TABLE――加载数据 ............................56

    正确答案:C 一.对答案解释: A.       TYPE:有两个选可供选择: 1.        ORACLE_LOADER:传统方式,与SQLLDR一样,参数从多,应用较多. 2.         ...

  10. arcengine 调用arctoolbox功能的举例 spatialJoin

    废话不多说,code是王道. 其中str1.str2两个参数是target路径.join路径 private void spatialJoin(Geoprocessor gp, string str1 ...