LINQ查询返回DataTable类型
个人感觉Linq实用灵活性很大,参考一篇大牛的文章LINQ查询返回DataTable类型
http://xuzhihong1987.blog.163.com/blog/static/26731587201101853740294/
附上自己写的一个测试程序源代码。
//创建自定义DataTable
String[] _sFiled = new String[] { "ID", "PC", "EPC", "CRC", "RSSI", "FREQANT", "INVCOUNT" };
# region Linq写法
// LinQ写法1:
//var numbers_1 = from number in numbers where (number % 2 == 0) orderby number descending select number;//orderby number descending 这是对筛选出来的数值进行排序
// foreach (var i in numbers_1)
// {
// Console.WriteLine(i);
// }
//LinQ写法2:
// var numbers_1 = numbers.Where(i => i % 2 == 0).Select(i => i);//输出用写法1一样
#endregion DataTable _dtAudit = CreateSelfDataTable(_sFiled); _dtAudit.Rows.Add("a1", "b1", "c1","","","","");
_dtAudit.Rows.Add("a1", "b2", "c2", "", "", "", "");
_dtAudit.Rows.Add("a2", "b3", "c3", "", "", "", "");
_dtAudit.Rows.Add("a3", "b4", "c4", "", "", "", "");
_dtAudit.Rows.Add("a1", "b5", "c5", "", "", "", "");
_dtAudit.Rows.Add("a2", "b6", "c6", "", "", "", ""); var query1 = (from contact in _dtAudit.AsEnumerable() //查询
orderby contact.Field<string>("ID") descending //排序
group contact by contact.Field<string>("PC") into g //分组
select new {ID=g.FirstOrDefault().Field<string>("ID"),PC=g.FirstOrDefault().Field<string>("PC"),EPC=
g.FirstOrDefault().Field<string>("EPC"),CRC=g.FirstOrDefault().Field<string>("CRC"),RSSI=g.FirstOrDefault(
).Field<string>("RSSI")}).ToList();
DataTable contacts1 =ToDataTable(query1);
SetListView(listView1, contacts1);
} /// <summary>
/// 创建自定义列DataTable
/// </summary>
/// <param name="sList"></param>
/// <returns></returns>
public DataTable CreateSelfDataTable(String[] sList)
{
DataTable _dtSelf = new DataTable(); foreach (String s in sList)
{
_dtSelf.Columns.Add(s);
}
_dtSelf.AcceptChanges(); return _dtSelf;
} /// <summary>
/// 下面通过一个方法来实现返回DataTable类型
/// 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()[];
}
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>
/// 绑定ListView
/// </summary>
private void SetListView(System.Windows.Forms.ListView listView, DataTable dt)
{
if (listView.Items.Count > )
{
listView.Items.Clear();
}
if (dt != null && dt.Rows.Count > )
{
ListViewItem lv = null;
for (int i = ; i < dt.Rows.Count; i++)
{
lv = new ListViewItem(dt.Rows[i][].ToString()); //创建一列的多行对象
lv.Tag = dt.Rows[i][].ToString(); //该lv对象绑定多行一列值
for (int j = ; j < dt.Columns.Count; j++)
{
lv.SubItems.Add(dt.Rows[i][j].ToString()); //一行添加多列的值
}
listView.Items.Add(lv);
} }
}
LINQ基本语法及其示例
http://xuzhihong1987.blog.163.com/blog/static/26731587201111342756123/
说明:
1、在未作任何说明的情况下,以下用到的db变量都是DataContext的实例对象,声明语法类似如下:
using (BP_DataClassesDataContext db = new BP_DataClassesDataContext(ConnectionStrings.GetInstance("ZJ").Con))
{
//Code
}
2、默认q为Iqueryable类型变量
简单查询:
var q = from p in db.view_PreTestResultAuditList
select p;
简单条件查询:
方式一:直接使用where关键字
var q = from c in db.view_PrTestList
where c.FTestmanID.Equals(UserContext.CurrentUser.FID)
select c;
方式二:使用lambda 表达式
var q = db.TOriInfoAutoMemory.Where(c => c.FSampleName == sampleName);
使用 &&和|| 带代替And或Or关键字:
var entity = db.TSampleOriginalInfo.FirstOrDefault(c => c.FFromID.Equals(fromID) && c.FSampleID.Equals(sampleID));
like模糊条件查询:
//使用C#中的Contains关键字代替SQL中的like关键字
q = q.Where(c => c.FTaskCode.Contains(condition.Name));
In包含查询:
/// <param name="certificateIDs"> string[] </param>
var certi = (from c in db.TMSCertificate
where certificateIDs.ToList().Contains(c.FID.ToString())
select c).ToList();
等价于:select * from TMSCertificate where FID in /* certificateIDs */
Skip和Take实现分页查询:
var q = from c in db.view_PrTestList
where c.FTestmanID.Equals(UserContext.CurrentUser.FID)
select c;
twi.data = (q.Skip(paging.startIndex).Take(paging.pageSize)).ToList();
//其中startIndex:跳过的系列中指定的条数
// pageSize:每页显示条数(记录数)
Distinct方法去除重复:
var p = (from c in dc.TSampleOriginalInfo
where sampleIDs.Contains(c.FSampleID.ToString())
select new
{
c.FFromID,
c.FName
}).Distinct();
查询指定列使new构造集合:
var p = (from c in dc.TSampleOriginalInfo
where sampleIDs.Contains(c.FSampleID.ToString())
select new
{
c.FFromID,
c.FName
}).Distinct();
join连接查询:详见下面的【join查询实例】
//此处省略……
FirstOrDefault查询满足条件的第一条记录或不存在是返回null,不发生异常:
foreach (var fromID in fromIDs)
{
var entity = db.TSampleOriginalInfo.FirstOrDefault(c => c.FFromID.Equals(fromID) && c.FSampleID.Equals(sampleID));
if (entity != null)
{
entities.Add(entity);
}
}
LINQ to SQL 的重要方法:SubmitChanges方法:
无论您对对象做了多少项更改,都只是在更改内存中的副本。您并未对数据库中的实际数据做任何更改。直到您对 DataContext 显式调用 SubmitChanges方法,您所做的更改才会传输到服务器。
db.SubmitChanges();
新增/删除/修改后都需要显式的调用该方法!
以下是示例代码
/// <summary> /// 添加 /// </summary> /// <param name="varCustomer">要添加的对象</param> /// <returns></returns> public bool New(TTrademark idc) { using (CP_DataClassesDataContext db = new CP_DataClassesDataContext(GS.MODEL.ConnectionStrings.GetInstance("ZJ").Con)) { if (idc != null) { db.TTrademark.InsertOnSubmit(idc); db.SubmitChanges(); return true; } else { return false; } } } /// <summary> /// 新增多个【使用InsertAllOnSubmit】 /// </summary> /// <param name="model"></param> public void New(GS.MODEL.TItem model) { using (CP_DataClassesDataContext db = new CP_DataClassesDataContext(GS.MODEL.ConnectionStrings.GetInstance("ZJ").Con)) { List<GS.MODEL.TItem> entities = new List<GS.MODEL.TItem>(); GS.MODEL.TItem entity = new GS.MODEL.TItem() { FID = Guid.NewGuid(), FName =model.FName , FParentName = model.FParentName, FFastCode = model.FFastCode, FRemark=model.FRemark, FSort=model.FSort }; entities.Add(entity); db.TItem.InsertAllOnSubmit(entities); db.SubmitChanges(); } } /// <summary> /// 修改 /// </summary> /// <param name="model"></param> public void Edit(GS.MODEL.TItem model) { using(CP_DataClassesDataContext db=new CP_DataClassesDataContext(GS.MODEL.ConnectionStrings.GetInstance("ZJ").Con)) { GS.MODEL.TItem items = db.TItem.Single(c => c.FID == model.FID); items.FName = model.FName; items.FParentName = model.FParentName; items.FRemark = model.FRemark; items.FSort = model.FSort; items.FFastCode = model.FFastCode; db.SubmitChanges(); } } /// <summary> /// 删除 /// </summary> /// <param name="IDs"></param> public void Delete(string[] ids) { using (CP_DataClassesDataContext db = new CP_DataClassesDataContext(GS.MODEL.ConnectionStrings.GetInstance("ZJ").Con)) { List<GS.MODEL.TItem> entities = new List<GS.MODEL.TItem>(); foreach (var id in ids) { var entity = db.TItem.FirstOrDefault(c => c.FID.Equals(id)); if (entity != null) { entities.Add(entity); } } db.TItem.DeleteAllOnSubmit(entities); db.SubmitChanges(); } } /// <summary> /// 【简单查询】获取指定计量标准考核证书下的计量标准器/检定规程/主要配套设备 /// </summary> /// <param name="certifiacteID"></param> /// <returns></returns> public IList<view_CertificateOriginalInfo> GetViewByCertificateID(Guid certifiacteID) { using (BPDataContext db = new BPDataContext(TCTC_ConnectionStrings.connStrJL)) { var d = from c in db.view_CertificateOriginalInfo where c.FCertificateID == certifiacteID select c; return d.ToList(); } } /// <summary> /// 【综合查询】我的待检测结果任务单 /// </summary> /// <param name="paging"></param> /// <param name="condition"></param> /// <returns></returns> public TwiReturn GetMyWorkList(PagingCondition paging, ConditionModel condition) { TwiReturn twi = new TwiReturn(); using (BP_DataClassesDataContext db = new BP_DataClassesDataContext(ConnectionStrings.GetInstance("ZJ").Con)) { var q = from c in db.view_PrTestList where c.FTestmanID.Equals(UserContext.CurrentUser.FID) select c; if (condition != null) { if (condition.NameSign == "TaskCode" && condition.Name != "") { q = q.Where(c => c.FTaskCode.Contains(condition.Name)); } else if (condition.NameSign == "TestItemName" && condition.Name != "") { q = q.Where(c => c.FTestItemName.Contains(condition.Name)); } } twi.totalCount = q.Count(); if (paging.needPaging) { twi.data = (q.Skip(paging.startIndex).Take(paging.pageSize)).ToList(); } else { twi.data = q.ToList(); } return twi; } } /// <summary> /// 选择计量标准考核证书 /// </summary> /// <param name="sampleIDs"></param> /// <param name="certificateIDs"></param> public void SelectCertificate(string[] sampleIDs, string[] certificateIDs) { BPDataContext bpDC = new BPDataContext(TCTC_ConnectionStrings.connStrJL); CPDataContext cpDc = new CPDataContext(TCTC_ConnectionStrings.connStrJL); var certi = (from c in cpDc.TMSCertificate where certificateIDs.ToList().Contains(c.FID.ToString()) select c).ToList(); List<TSampleOriginalInfo> entities = new List<TSampleOriginalInfo>(); foreach (var sampleID in sampleIDs) { foreach (var c in certi) { TSampleOriginalInfo entity = new TSampleOriginalInfo() { FID = Guid.NewGuid(), FFromID = c.FID, FType = , FSampleID = new Guid(sampleID), FName = c.FCertificateName, FCode = c.FCode, FRange = c.FMeasurementRange, FUncertainty = c.FLevel, FCertificateNo = c.FCode,//c.FNumber,zjw修改 FValidDateTo = c.FPeriodDate }; entities.Add(entity); } } bpDC.TSampleOriginalInfo.InsertAllOnSubmit(entities); bpDC.SubmitChanges(); bpDC.Dispose(); cpDc.Dispose(); } /// <summary> /// 获取样品之标准/计量标准器/主要配套设备/检定规程 /// </summary> /// <param name="sampleIDs"></param> /// <returns></returns> public DataTable GetBySampleIDs(List<string> sampleIDs) { using (BPDataContext dc = new BPDataContext(TCTC_ConnectionStrings.connStrJL)) { var p = (from c in dc.TSampleOriginalInfo where sampleIDs.Contains(c.FSampleID.ToString()) select new { c.FFromID, c.FType, c.FName, c.FCode, c.FRange, c.FModel, c.FUncertainty, c.FCertificateNo, c.FValidDateTo, c.FManufacturer }).Distinct(); return LinqToDataTable.ToDataTable(p.ToList()); } } /// <summary> /// 【join查询实例】获取带检测的器具信息 /// </summary> /// <returns></returns> public DataTable GetBySampleName(string sampleName) { using (BPDataContext dc = new BPDataContext(TCTC_ConnectionStrings.connStrJL)) { var sample = from c in dc.view_Sample_WithVCItem where c.FEndTag == && c.FTaskEndTag == && c.FOutSourcingTag == && c.FAssignTag == && c.FTestCompleteTag == && c.FIsOuter == "否" select c; var r = from s in sample join v in dc.view_GetSampleLeastOrginalRecord on s.FID equals v.FSampleID into recs from v in recs.DefaultIfEmpty() join t in dc.TTask on s.FTaskID equals t.FID into ts from t in ts where (sampleName == "" ? true : s.FName == sampleName) && (s.FReceiverID == UserContext.CurrentUser.FID || TCTC_ConnectionStrings.TestResultFilterByTester == "") orderby s.FName, t.FCode, s.FCode select new { SampleID = s.FID, SampleCode = s.FCode, s.FName, s.FAnotherName, s.FTaskID, s.FIsRepair, s.FIsNeedOriginalRecord, s.FTestProperty, s.FRepairTag, s.VCItemID, s.CertiID, s.CertiName, s.TechID, s.TechName, s.TechCode, s.FReTestTag, s.FReTestFromTag, v.FNumber, v.FFileName, v.FCertificateNo, v.FOriginalRecordID, v.FTag, TaskCode = t.FCode, t.FRemark, t.FIsUrgent, s.FTaskType, s.FTaskTypeID, s.FMeasurementRange, s.FLevel, s.FSigPrice }; DataTable dt = LinqToDataTable.ToDataTable(r.ToList()); return dt; } }
LINQ查询返回DataTable类型的更多相关文章
- LINQ查询返回DataTable类型[轉]與将DataTable序列化为Json格式【轉】
(原文地址:http://xuzhihong1987.blog.163.com/blog/static/26731587201101853740294/) LINQ查询返回DataTable类型 在使 ...
- 转:LINQ查询返回DataTable类型
动态绑定ReportViewer虽然之前实现过,但现在弄起来还是有点晕,主要是过去没有使用Linq,数据的操作经常用到DataTable,可以直接拿来使用,现在用Linq更方便,也懒得再用之前的数据库 ...
- LINQ返回DataTable类型 list转dataset 转换为JSON对象
using System.Web.Script.Serialization; using System.Collections.Generic; using System.Reflection; us ...
- .NET LINQ查询操作中的类型关系
LINQ 查询操作中的类型关系 若要有效编写查询,您应该了解完整的查询操作中的变量类型是如何全部彼此关联的. 如果您了解这些关系,就能够更容易地理解文档中的 LINQ 示例和代码示例. 另外 ...
- Hibernate应用SQL查询返回实体类型
Hibernate应用SQL查询返回实体类型 Hibernate使用SQL查询返回实体类型 以前,使用SQL查询,结果放在 RS 结果集中,还要去转换影射到Java类中.Hibernate中,可以自动 ...
- 把Linq查询返回的var类型的数据 转换为DataTable EF连接查询
问题:我要获得一个角色下对应的所有用户,需要两表连接查询,虽然返回的只有用户数据,但是我想到若是返回的不只是用户数据,而还要加上角色信息,那么我返回什么类型呢,返回var吗,这样不行. 于是我网上找找 ...
- C#3.0新增功能09 LINQ 基础06 LINQ 查询操作中的类型关系
连载目录 [已更新最新开发文章,点击查看详细] 若要有效编写查询,应了解完整的查询操作中的变量类型是如何全部彼此关联的. 如果了解这些关系,就能够更容易地理解文档中的 LINQ 示例和代码示例. ...
- HQL查询——查询返回对象类型分析
关于HQL查询,我们可以结合hibernate的API文档,重点围绕org.hibernate.Query接口,分析其方法,此接口的实例对象是通过通过session.对象的creatQuery(Str ...
- Dapper查询返回Datatable
dapper封装的扩展方法中,没有直接返回datatable的方法,项目中有些时候需要用到这样的返回格式,而为了项目数据框架的统一性, 不好直接用其他框架,如果直接将查询出来的泛型集合转datatab ...
随机推荐
- [译]Exploring Angular 1.3: Binding to Directive Controllers
原文: http://blog.thoughtram.io/angularjs/2015/01/02/exploring-angular-1.3-bindToController.html Angul ...
- 如何催促Apple进行App审核
为什么提交给 App Store 的应用进入"审核(In Review)"状态后, 仍然可能会等待好多天的时间 ? 不过你也可以通过催促Apple进行App审核来缩短这个时间.以下 ...
- RGB颜色矩提取算法——Matlab
一.颜色矩公式 一阶颜色矩——均值,反映图像明暗程度 二阶颜色矩 ——标准差,反映图像颜色分布范围 三阶颜色矩 ——方差,反映图像颜色分布对称性 二.方法一: firstMoment = mean(m ...
- PHP基础OOP(二) 多态
PHP 基础 多态 ====================多态是一种思想:从一个基类中派生,响应一个虚命令,产生不同的结果. 不同的对象执行相同的方法而产生不同的行 ...
- Java设计模式 之 代理模式
所谓的代理模式就是为其它类或对象提供一个代理以控制对这个对象的访问.那么常见的代理有远程代理,虚拟代理,保护代理,智能代理. 1. 远程代理:为一个不同地址空间的对象提供一个本地代理对象. 2. 虚拟 ...
- iOS开发——UI基础-自定义构造方法,layoutSubviews,Xib文件,利用Xib自定义View
一.自定义构造方法 有时候需要快速创建对象,可以自定义构造方法 + (instancetype)shopView { return [[self alloc] init]; } - (instance ...
- BZOJ4612——[Wf2016]Forever Young
1.题意:将一个数y转化成b进制数,使得他>=l,且<y,且转化后均为0~9,使b最大. 2.分析:我们发现要么答案的b很小,要么y很小..那我们直接暴力枚举就好了啊 然后判断一下...另 ...
- ubuntu安装android开发环境
1.安装oracle-jdk 打开终端,使用下面的命令: java -version 如果你看到像下面的输出,这就意味着你并没有安装过Java: The program ‘java’ can be f ...
- Cocos2d-x 3.0 Json用法 Cocos2d-x xml解析
Cocos2d-x 3.0 加入了rapidjson库用于json解析.位于external/json下. rapidjson 项目地址:http://code.google.com/p/rapidj ...
- 新技能get——斜率优化
好久没写博客了……我终于回来了…… dp总是令我很头疼的问题之一,然而我还是要学一下怎么优化它. 下面请看一道题吧: [bzoj3675][Apio2014]序列分割 试题描述 小H最近迷上了一个分割 ...