LINQ基本语法及其示例.docx
《LINQ基本语法及其示例.docx》由会员分享,可在线阅读,更多相关《LINQ基本语法及其示例.docx(17页珍藏版)》请在冰豆网上搜索。
LINQ基本语法及其示例
LINQ基本语法及其示例
说明:
1、在未作任何说明的情况下,以下用到的db变量都是DataContext的实例对象,声明语法类似如下:
using(BP_DataClassesDataContextdb=newBP_DataClassesDataContext(ConnectionStrings.GetInstance("ZJ").Con))
{
//Code
}
2、默认q为Iqueryable类型变量
简单查询:
varq=frompindb.view_PreTestResultAuditList
selectp;
简单条件查询:
方式一:
直接使用where关键字
varq=fromcindb.view_PrTestList
wherec.FTestmanID.Equals(UserContext.CurrentUser.FID)
selectc;
方式二:
使用lambda表达式
varq=db.TOriInfoAutoMemory.Where(c=>c.FSampleName==sampleName);
使用&&和||带代替And或Or关键字:
varentity=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包含查询:
///string[]
varcerti=(fromcindb.TMSCertificate
wherecertificateIDs.ToList().Contains(c.FID.ToString())
selectc).ToList();
等价于:
select*fromTMSCertificatewhereFIDin/*certificateIDs*/
Skip和Take实现分页查询:
varq=fromcindb.view_PrTestList
wherec.FTestmanID.Equals(UserContext.CurrentUser.FID)
selectc;
twi.data=(q.Skip(paging.startIndex).Take(paging.pageSize)).ToList();
//其中startIndex:
跳过的系列中指定的条数
//pageSize:
每页显示条数(记录数)
Distinct方法去除重复:
varp=(fromcindc.TSampleOriginalInfo
wheresampleIDs.Contains(c.FSampleID.ToString())
selectnew
{
c.FFromID,
c.FName
}).Distinct();
查询指定列使new构造集合:
varp=(fromcindc.TSampleOriginalInfo
wheresampleIDs.Contains(c.FSampleID.ToString())
selectnew
{
c.FFromID,
c.FName
}).Distinct();
join连接查询:
详见下面的【join查询实例】
//此处省略……
FirstOrDefault查询满足条件的第一条记录或不存在是返回null,不发生异常:
foreach(varfromIDinfromIDs)
{
varentity=db.TSampleOriginalInfo.FirstOrDefault(c=>c.FFromID.Equals(fromID)&&c.FSampleID.Equals(sampleID));
if(entity!
=null)
{
entities.Add(entity);
}
}
LINQtoSQL的重要方法:
SubmitChanges方法:
无论您对对象做了多少项更改,都只是在更改内存中的副本。
您并未对数据库中的实际数据做任何更改。
直到您对DataContext显式调用SubmitChanges方法,您所做的更改才会传输到服务器。
db.SubmitChanges();
新增/删除/修改后都需要显式的调用该方法!
以下是几个完整的示例:
///
///添加
///
///要添加的对象
///
publicboolNew(TTrademarkidc)
{
using(CP_DataClassesDataContextdb=newCP_DataClassesDataContext(GS.MODEL.ConnectionStrings.GetInstance("ZJ").Con))
{
if(idc!
=null)
{
db.TTrademark.InsertOnSubmit(idc);
db.SubmitChanges();
returntrue;
}
else
{
returnfalse;
}
}
}
///
///新增多个【使用InsertAllOnSubmit】
///
///
publicvoidNew(GS.MODEL.TItemmodel)
{
using(CP_DataClassesDataContextdb=newCP_DataClassesDataContext(GS.MODEL.ConnectionStrings.GetInstance("ZJ").Con))
{
Listentities=newList();
GS.MODEL.TItementity=newGS.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();
}
}
///
///修改
///
///
publicvoidEdit(GS.MODEL.TItemmodel)
{
using(CP_DataClassesDataContextdb=newCP_DataClassesDataContext(GS.MODEL.ConnectionStrings.GetInstance("ZJ").Con))
{
GS.MODEL.TItemitems=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();
}
}
///
///删除
///
///
publicvoidDelete(string[]ids)
{
using(CP_DataClassesDataContextdb=newCP_DataClassesDataContext(GS.MODEL.ConnectionStrings.GetInstance("ZJ").Con))
{
Listentities=newList();
foreach(varidinids)
{
varentity=db.TItem.FirstOrDefault(c=>c.FID.Equals(id));
if(entity!
=null)
{
entities.Add(entity);
}
}
db.TItem.DeleteAllOnSubmit(entities);
db.SubmitChanges();
}
}
///
///【简单查询】获取指定计量标准考核证书下的计量标准器/检定规程/主要配套设备
///
///
///
publicIListGetViewByCertificateID(GuidcertifiacteID)
{
using(BPDataContextdb=newBPDataContext(TCTC_ConnectionStrings.connStrJL))
{
vard=fromcindb.view_CertificateOriginalInfo
wherec.FCertificateID==certifiacteID
selectc;
returnd.ToList();
}
}
///
///【综合查询】我的待检测结果任务单
///
///
///
///
publicTwiReturnGetMyWorkList(PagingConditionpaging,ConditionModelcondition)
{
TwiReturntwi=newTwiReturn();
using(BP_DataClassesDataContextdb=newBP_DataClassesDataContext(ConnectionStrings.GetInstance("ZJ").Con))
{
varq=fromcindb.view_PrTestList
wherec.FTestmanID.Equals(UserContext.CurrentUser.FID)
selectc;
if(condition!
=null)
{
if(condition.NameSign=="TaskCode"&&condition.Name!
="")
{
q=q.Where(c=>c.FTaskCode.Contains(condition.Name));
}
elseif(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();
}
returntwi;
}
}
///
///选择计量标准考核证书
///
///
///
publicvoidSelectCertificate(string[]sampleIDs,string[]certificateIDs)
{
BPDataContextbpDC=newBPDataContext(TCTC_ConnectionStrings.connStrJL);
CPDataContextcpDc=newCPDataContext(TCTC_ConnectionStrings.connStrJL);
varcerti=(fromcincpDc.TMSCertificate
wherecertificateIDs.ToList().Contains(c.FID.ToString())
selectc).ToList();
Listentities=newList();
foreach(varsampleIDinsampleIDs)
{
foreach(varcincerti)
{
TSampleOriginalInfoentity=newTSampleOriginalInfo()
{
FID=Guid.NewGuid(),
FFromID=c.FID,
FType=1,
FSampleID=newGuid(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();
}
///
///获取样品之标准/计量标准器/主要配套设备/检定规程
///
///
///
publicDataTableGetBySampleIDs(ListsampleIDs)
{
using(BPDataContextdc=newBPDataContext(TCTC_ConnectionStrings.connStrJL))
{
varp=(fromcindc.TSampleOriginalInfo
wheresampleIDs.Contains(c.FSampleID.ToString())
selectnew
{
c.FFromID,
c.FType,
c.FName,
c.FCode,
c.FRange,
c.FModel,
c.FUncertainty,
c.FCertificateNo,
c.FValidDateTo,
c.FManufacturer
}).Distinct();
returnLinqToDataTable.ToDataTable(p.ToList());
}
}
///
///【join查询实例】获取带检测的器具信息
///
///
publicDataTableGetBySampleName(stringsampleName)
{
using(BPDataContextdc=newBPDataContext(TCTC_ConnectionStrings.connStrJL))
{
varsample=fromcindc.view_Sample_WithVCItem
wherec.FEndTag==1&&c.FTaskEndTag==1&&c.FOutSourcingTag==0&&c.FAssignTag==1&&c.FTestCompleteTag==0&&c.FIsOuter=="否"
selectc;
varr=fromsinsample
joinvindc.view_GetSampleLeastOrginalRecord
ons.FIDequalsv.FSampleIDintorecs
fromvinrecs.DefaultIfEmpty()
jointindc.TTask
ons.FTaskIDequalst.FIDintots
fromtints
where(sampleName==""?
true:
s.FName==sampleName)&&(s.FReceiverID==UserContext.CurrentUser.FID||TCTC_ConnectionStrings.TestResultFilterByTester=="0")
orderbys.FName,t.FCode,s.FCode
selectnew
{
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
};
DataTabledt=LinqToDataTable.ToDataTable(r.ToList());
returndt;
}
}
LINQ查询返回DataTable类型
在使用LINQ查询的时候,一般我们会返回List或IList类型,如下所示:
例1:
publicListGetList()
{
using(BPDataContextdb=newBPDataContext(TCTC_ConnectionStrings.connStr))
{
varq=from pindb.TSample
selectp;
returnq.ToList();
}
}
例1实现的是一个最简单的列表查询,返回的是List类型,本身没有任何问题!
但是如果现在希望查询TSample表中的指定几列,代码应该是:
varq=frompindb.TSample
selectnew
{
p.FID,
p.FName
};
returnq.ToList();
现在问题是返回类型该写什么呢?
new{p.FID,p.FName}已经不是TSample类型了,又不支持返回值为List的!
可能的解决方案是:
方法一:
先扩展一个类SampleEx
publicclassSampleEx
{
publicGuidFID
{
get;
set;
}
publicstringFName
{
get;
set;
}
}
然后返回List类型
publicListGetList()
{
using(BPDataContextdb=newBPDataContext(TCTC_ConnectionStrings.connStr))
{
varq=frompindb.TSample
selectnewSampleEx()
{
FID=p.FID,
FName=p.FName
};
returnq.ToList();
}
}
这样就达到了我们想要的目标。
问题是解决了,但是再仔细想想这样的解决方案似乎可行性不强。
因为在实际开发中我们经常查询两个表join查询,那么重新组合的字段就比较多了,要每个都去扩展单独的类,工作量太大!
有些人可能会想到用试图,然后dbml会自动帮我们生成类,但是这个工作