版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一步一步学Linqtosql(一):预备知识
什么是Linqtosql
Linqtosql(或者叫DLINQ)是LINQ(.NET语言集成查询)的
一部分,全称基于关系数据的.NET语言集成查询,用于以对象形式
管理关系数据,并提供了丰富的查询功能,它和Linqtoxml、Linq
toobjects>Linqtodataset>Linqtoentities等组成了强大的
LINQo
要学好LINQ查询语法,就不得不先理解C#3.0的一些新特性,
下面一一简单介绍。
隐含类型局部变量
varage=26;
varusername="zhuye";
varuserlist=new[]{"a","b"j"c");
foreach(varuserinuserlist)
Console.WriteLine(user);
纯粹给懒人用的var关键字,告诉编译器(对于CLR来说,它是
不会知道你是否使用了var,苦力是编译器出的),你自己推断它的
类型吧,我不管了。但是既然让编译器推断类型就必须声明的时候赋
值,而且不能是null值。注意,这只能用于局部变量,用于字段是
不可以的。
匿名类型
vardata=new{username="zhuye",age=26};
Console.WriteLine("username:{0}age:{1}",
data.username,data.age);
匿名类型允许开发人员定义行内类型,无须显式定义类型。常和
var配合使用,var用于声明匿名类型。定义一个临时的匿名类型在
LINQ查询句法中非常常见,我们可以很方便的实现对象的转换和投
影。
扩展方法
publicstaticclasshelper
{
publicstaticstringMD5Hash(thisstrings)
{
return
System.Web.Security.FormsAuthentication.HashPasswordF
orStoringInConfigFile(s,"MD5");
)
publicstaticboolIn(thisobjecto,lEnumerable
b)
(
foreach(objectobjinb)
(
if(obj==o)
returntrue;
)
returnfalse;
)
)
//调用扩展方法
Console.WriteLine("123456".MD5Hash());
Console.WriteLine("1".In(new[]{"1"2","3")));
很多时候我们需要对CLR类型进行一些操作,苦于无法扩展CLR
类型的方法,只能创建一些helper方法,或者生成子类。扩展方法
使得这些需求得意实现,同时也是实现LINQ的基础。定义扩展方法
需要注意,只能在静态类中定义并且是静态方法,如果扩展方法名和
原有方法名发生冲突,那么扩展方法将失效。
自动属性
publicclassPerson
{
publicstringusername{get;protectedset;}
publicintage{get;set;}
publicPerson()
{
this.username="zhuye";
)
)
Personp=newPerson();
//p.username="aa";
Console.WriteLine(p.username);
意义不是很大,纯粹解决机械劳动。编译器自动为你生成get、
set操作以及字段,并且你不能使用字段也不能自定义get、set操
作,不过你可以分别定义get和set的访问级别。
对象初始化器
publicclassPerson
{
publicstringusername{get;set;}
publicintage{get;set;}
publicoverridestringToString()
(
returnstring.Format("username:{0}age:{1}",
this.username,this.age);
)
)
Personp=newPerson(){username="zhuye",age=26};
Console.WriteLine(p.ToString());
编译器会自动为你做setter操作,使得原本几行的属性赋值操作
能在一行中完成。这里需要注意:
•允许只给一部分属性赋值,包括
internal访问级别
•可以结合构造函数一起使用,并
且构造函数初始化先于对象初始化
器执行
集合初始化器
publicclassPerson
(
publicstringusername{get;set;}
publicintage{get;set;}
publicoverridestringToString()
{
returnstring.Format("username:{0}age:{1}",
this.username,this.age);
)
)
varpersons=newList<Person>{
newPerson{username="a",age=l},
newPerson{username="b",age=2}};
foreach(varpinpersons)
Console.WriteLine(p.ToString());
编译器会自动为你做集合插入操作。如果你为Hashtable初始化
的话就相当于使用了两个对象初始化器。
Lambda表达式
varlist=new[]{"aa","bb","ac"};
varresult=Array.FindAll(list,s=>(s.IndexOf("a")>
-1));
foreach(varvinresult)
Console.WriteLine(v);
其实和2.0中的匿名方法差不多,都是用于产生内联方法,只不
过Lambda表达式的语法更为简洁。语法如下:
(参数列表)=>表达式或者语句块
其中:
参数个数:可以有多个参数,一个参数,或者无参数。
表达式或者语句块:这部分就是我们平常写函数的实现部分(函数
体)。
前面的示例分别是1个参数的例子,下面结合扩展方法来一个复
杂的例子:
publicdelegateintmydg(inta,intb);
publicstaticclassLambdaTest
(
publicstaticintoper(thisinta,intb,mydg
dg)
{
returndg(a,b);
)
)
Console.WriteLine(l.oper(2j(a,b)=>a+b));
Console.WriteLine(2.oper(l,(a,b)=>a-b));
查询句法
varpersons=newList<Person>{
newPerson{username="a",age=19},
newPerson{username="b",age=20},
newPerson{username="a",age=21},
};
varselectperson=frompinpersonswherep.age>=20
selectp.username.ToUpper();
foreach(varpinselectperson)
Console.WriteLine(p);
查询句法是使用标准的LINQ查询运算符来表达查询时一个方便的
声明式简化写法。该句法能在代码里表达查询时增进可读性和简洁
性,读起来容易,也容易让人写对。VisualStudio对查询句法提供
了完整的智能感应和编译时检查支持。编译器在底层把查询句法的表
达式翻译成明确的方法调用代码,代码通过新的扩展方法和Lambda
表达式语言特性来实现。上面的查询句法等价于下面的代码:
varselectperson=
persons.Where(p=>p.age>=20).Select(p=>p.username.ToUp
per());
LINQ查询句法可以实现90%以上T-SQL的功能(由于T-SQL是基
于二维表的,所以LINQ的查询语法会比T-SQL更简单和灵活),但
是由于智能感应的原因,select不能放在一开始就输入。
今天就说到这里,再见!
一步一步学Linqtosql(二):DataContext与实体
DataContext
DataContext类型(数据上下文)是System.Data.Linq命名空间下
的重要类型,用于把查询句法翻译成SQL语句,以及把数据从数据
库返回给调用方和把实体的修改写入数据库。
DataContext提供了以下一些使用的功能:
•以日志形式记录DataContext生
成的SQL
执行SQL(包括查询和更新语句)
•创建和删除数据库
DataContext是实体和数据库之间的桥
梁,那么首先我们需要定义映射到数据
表的实体。
定义实体类
usingSystem.Data.Linq.Mapping;
[Table(Name="Customers")]
publicclassCustomer
{
[Column(IsPrimaryKey=true)]
publicstringCustomerlD{get;set;}
[Column(Name="ContactName")]
publicstringName{get;set;}
[Column]
publicstringCity{get;set;}
)
以Northwind数据库为例,上述Customers类被映射成一个表,对
应数据库中的Customers表。然后在类型中定义了三个属性,对应表
中的三个字段。其中,CustomerlD字段是主键,如果没有指定Column
特性的Name属性,那么系统会把属性名作为数据表的字段名,也就
是说实体类的属性名就需要和数据表中的字段名一致。
现在,创建一个ASP.NET页面,然后在页面上加入一个GridView
控件,使用下面的代码进行绑定数据:
usingSystem.Data.Linq;
DataContextctx=new
DataContext("server=xxx;database=Northwind;uid=xxx;pw
d=xxx");
Table<Customer>Customers=ctx.GetTable<Customer>();
GridViewl.DataSource=fromcinCustomerswhere
c.CustomerlD.StartsWith("A")selectnew{顾客
ID=c.CustomerlD顾客名=c.Name,城市=c.City};
GridViewl.DataBind();
使用DataContext类型把实体类和数据库中的数据进行关联。你可
以直接在DataContext的构造方法中定义连接字符串,也可以使用
IDbConnection:
usingSystem.Data.SqlClient;
IDbConnectionconn=new
SqlConnection("server=xxx;database=Northwind;uid=xxx;
pwd=xxx");
DataContextctx=newDataContext(conn);
之后,通过GetTable获取表示底层数据表的Table类型,显然,
数据库中的Customers表的实体是Customer类型。随后的查询句法,
即使你不懂SQL应该也能看明白。从Customers表中找出CustomerlD
以“A”开头的记录,并把CustomersID、Name以及City封装成新的匿
名类型进行返回。
结果如下图:
顾客ID顾客名城市
ALFKIMariaAndersBerlin
ANATRAnaTnijifloMexicoD.F.
ANTONAntonioMorenoMexicoD.F.
AROUTThomasHardyLondon
强类型DataContext
publicpartialclassNorthwindDataContext:DataContext
(
publicTable<Customer>Customers;
publicNorthwindDataContext(IDbConnection
connection):base(connection){}
publicNorthwindDataContext(stringconnection):
base(connection){}
)
强类型数据上下文使代码更简洁:
NorthwindDataContextctx=new
NorthwindDataContext("server=xxx;database=Northwind;u
id=xxx;pwd=xxx");
GridViewl.DataSource=fromcinctx.Customerswhere
c.CustomerlD.StartsWith("A")selectnew{顾客工D=
c.Customer工D,顾客名=c.Name,城市=c.City};
GridViewl.DataBind();
DataContext其实封装了很多实用的功能,下面介绍。
日志功能
usingSystem.10;
NorthwindDataContextctx=new
NorthwindDataContext("server=xxx;database=Northwind;u
id=xxx;pwd=xxx");
StreamWritersw=new
Streamwriter(Server.MapPath("log.txt")true);//
Append
ctx.Log=sw;
GridViewl.DataSource=fromcinctx.Customerswhere
c.CustomerlD.StartsWith("A")selectnew{顾客工D=
c.Customer工D,顾客名=c.Name,城市=c.City};
GridViewl.DataBind();
sw.Close();
运行程序后在网站所在目录生成了10g.txt,每次查询都会把诸如
下面的日志追加到文本文件中:
SELECT[t0].[CustomerlD][t0].[ContactName]
[t0].[City]
FROM[Customers]AS[t0]
WHERE[t0].[CustomerlD]LIKE@p0
--@p0:InputString(Size=2;Prec=0;Scale=0)[A%]
--Context:SqlProvider(Sql2005)Model:
AttributedMetaModelBuild:3.5,20706.1
应该说这样的日志对于调试程序是非常有帮助的。
探究查询
usingSystem.Data.Common;
usingSystem.Collections.Generic;
NorthwindDataContextctx=new
NorthwindDataContext("server=xxx;database=Northwind;u
id=xxx;pwd=xxx");
varselect=fromcinctx.Customerswhere
c.CustomerlD.StartsWith("A")selectnew{顾客工D=
c.CustomerlDj顾客名=c.Name,城市=c.City};
DbCommandcmd=ctx.GetCommand(select);
Response.Write(cmd.CommandText+"<br/>");
foreach(DbParameterparmincmd.Parameters)
Response.Write(string.Format("参数名:{0},参数
值:{l}<br/>”,parm.ParameterName,parm.Value));
Customercustomer=ctx.Customers.First();
customer.Name="zhuye";
IList<object>queryText=
ctx.GetChangeSet().ModifiedEntities;
Response.Write(((Customer)queryText[0]).Name);
在这里,我们通过DataContext的GetCommand方法获取了查询
对应的DbCommand,并且输出了CommandText和所有的
DbParametero之后,我们又通过GetChangeSet方法获取了修改后的
实体,并输出了修改内容。
执行查询
NorthwindDataContextctx=new
NorthwindDataContext("server=xxx;database=Northwind;u
id=xxx;pwd=xxx");
stringnewcity="Shanghai";
ctx.ExecuteCommand("updateCustomerssetCity={0}where
CustomerlDlike'A%'",newcity);
IEnumerable<Customer>customers=
ctx.ExecuteQuery<Customer>("select*fromCustomers
whereCustomerlDlike'A%'");
GridViewl.DataSource=customers;
GridViewl.DataBind();
前一篇文章已经说了,虽然Linqtosql能实现90%以上的TSQL
功能。但是不可否认,对于复杂的查询,使用TSQL能获得更好的效
率。因此,DataContext类型也提供了执行SQL语句的能力。代码的
执行结果如下图:
CustomerlDNameCity
ALFKIMariaAndersShanghai
ANATRAnaTrujilloShanghai
ANTONAntonioMorenoShanghai
AROUTThomasHardyShanghai
创建数据库
testcontextctx=new
testcontext("server=xxx;database=testdb;uid=xxx;pwd=x
xx");
ctx.CreateDatabase();
[Table(Name="test")]
publicclasstest
(
[Column(IsPrimaryKey=true,IsDbGenerated=true)]
publicintID{get;set;}
[Column(DbType="varchar(20)")]
publicstringName{get;set;}
)
publicpartialclasstestcontext:DataContext
{
publicTable<test>test;
publictestcontext(stringconnection):
base(connection){}
)
这段代码在数据库中创建了名为testdb的数据库,等同于下面的
脚本:
CREATETABLE[dbo].[test](
[ID][int]IDENTITY(1,1)NOTNULL,
[Name][varchar](20)COLLATEChinese_PRC_CI_AS
NULL,
CONSTRAINT[PK_test]PRIMARYKEYCLUSTERED
[ID]ASC
)WITH(IGNORE_DUP_KEY=OFF)ON[PRIMARY]
)ON[PRIMARY]
同时,DataContext还提供了DeleteDatabase。方法,在这里就不歹ll
举了。
使用DbDataReader数据源
usingSystem.Data.SqlClient;
varconn=new
SqlConnection("server=xxx;database=Northwind;uid=xxx;
pwd=xxx");
varctx=newDataContext(conn);
varcmd=newSqlCommand("select*fromcustomerswhere
CustomerlDlike'A%'",conn);
conn.Open();
varreader=cmd.ExecuteReader();
GridViewl.DataSource=ctx.Translate<Customer>(reader);
GridViewl.DataBind();
conn.Close();
你同样可以选择使用DataReader获取数据,增加了灵活性的同时
也增加了性能。
看到这里,你可能会觉得手工定义和数据库中表对应的实体类很
麻烦,不用担心,VS2008提供了自动生成实体类以及关系的工具,
工具的使用将在以后讲解。今天就讲到这里,和DataContext相关的
事务、加载选项、并发选项以及关系实体等高级内容也将在以后讲解。
CastomerlDNameCity
ALFKIMariaAndersShanghai
ANATRAnaTrujilloShanghai
ANTONAntonioMorenoShanghai
AROUTThomasHardyShanghai
步一步学Linqtosql(三):增删改
示例数据库
字段名字段类型允许字段说明
空
IDuniqueidentifier表主键字段
UserNamevarchar(50)留言用户名
PostTimedatetime留言时间
Messagevarchar(400)V留言内容
IsRepliedbit留言是否回复
Replyvarchar(400)V留言管理员回复
在数据库中创建一个名为GuestBook的数据库,在里面创建一个
tbGuestBook的表,结构如上表。
生成实体类
右键点击网站项目,选择添加新项,然后选择“LinqtosqlClasses”,
命名为GuestBook。然后打开App_Code里面的GuestBook.dbml。设
计视图上的文字提示你可以从服务器资源管理器或者攻击箱拖动项
到设计界面上来创建实体类。
那么,我们就在服务器资源管理器中创建一个指向GuestBook数
据库的数据连接,然后把tbGuestBook表拖动到GuestBook.dbml的设
计视图上,按CTRL+S保存。打开GuestBook.designer.cs可以发现系
统自动创建了GuestBook数据库中tbGuestBook表的映射,如下图:
[Table(Name=ndbo.tbGuestBookn)]
3publicpartialclasstbGuestBock:INotifyPropertyChanging,INotifxPropertyChanged
{
privatestaticPrope--tyChangingEvent^^gsemptyChangingEventArgs=newPrcpe-tyChangingE.ent.
privateSystem.Quid_ID;
privatestring_UserName;
privateSystem.DateTime_PostTime;
privatestring_Message;
privatebool_IsReplied;
privatestring_Reply;
][ExtensibilityMethodDefinitions)
ipublictbGuestBook()
<
OnCreated();
-}
,,,
[Column(Storage='_IDiDbType="Uniqueldenti-FierNOTNULL”,IsPrimaryKey=true)]
]publicSystem.GuidIDl...j
[Colun-nCStorages^^UserNare",DbType=',VarChar(50)NOTNULL”,CanBeNull=false)]
]publicstringUserNarre
[Column(Storage=,,_PostTime,\DbTypes^DateTimeNOTNULL")]
jpublicSystem.DateTimePostTime|...|
简易留言簿
现在,我们就可以使用Linqtosql完成简易留言簿了。实现以下
功能:
•发表留言(增)
•查看留言(查)
•管理员回复留言(改)
管理员删除留言(删除)
首先,创建一个Default.aspx,在页面上
加入一些控件:
<div>
姓名
<asp:TextBoxID="tb_UserName"
runat="server"></asp:TextBoxxbr/>
<br/>
留言
<asp:TextBoxID="tb_Message"runat="server"
Height="100px"TextMode="MultiLine"
Width="300px"x/asp:TextBoxxbr/>
<br/>
<asp:ButtonID="btn_SendMessage"runat="server"
Text="发表留言"OnClick="btn_SendMessage_Click"/xbr/>
<br/>
<asp:RepeaterID="rpt_Message"runat="server">
<ItemTemplate>
<tablewidth="600px"style="border:solidlpx
#666666;font-size:10pt;background-color:#f0f0f0">
<tr>
<tdalign="left"width="400px">
<%#Eval("Message")%>
</td>
<tdalign="right"width="200px">
<%#Eval("PostTime")%>-<%#
Eval("UserName")%>
</td>
</tr>
<tr>
<tdcolspan="2"align="right">
<hrwidth="300px"/>
管理员回复:<%#Eval("IsReplied").ToString()
=="False"?"暂无":Eval("Reply")%>
</td>
</tr>
</table>
<br/>
</ItemTemplate>
</asp:Repeater>
</div>
你可能很难想象,使用Linqtosql进行数据访问会是这么简单,
后台代码:
publicpartialclassDefault:System.Web.UI.Page
(
GuestBookDataContextctx=new
GuestBookDataContext("server=xxx;database=GuestBook;u
id=xxx;pwd=xxx");
protectedvoidPage_Load(objectsender,EventArgse)
(
if(!IsPostBack)
(
SetBind();
)
)
protectedvoidbtn_SendMessage_Click(objectsender,
EventArgse)
{
tbGuestBookgb=newtbGuestBook();
gb.ID=Guid.NewGuid();
gb.UserName=tb_UserName.Text;
gb.Message=tb_Message.Text;
gb.IsReplied=false;
gb.PostTime=DateTime.Now;
ctx.tbGuestBooks.Add(gb);
ctx.SubmitChangesO;
SetBind();
)
privatevoidSetBind()
(
rpt_Message.DataSource=fromgbin
ctx.tbGuestBooksorderbygb.PostTimedescendingselect
gb;
rpt_Message.DataBind();
)
)
前面创建LinqtosqlClasses的时候我们输入名字GuestBook,系
统就为我们自动创建了GuestBookDataContext(你也可以在
GuestBook.Designer.cs中找到类定义)。在绑定的时候我们使用查询
句法查询留言表中所有留言,按照发表时间倒序(天哪?这是数据访
问吗?好像仅仅定义了一句SQL啊)。在发表留言按钮中,我们为
一个tbGuestBook赋值,然后把它加入留言表,再提交更改,就这样
完成了记录的插入。
运行效果如下图:
姓名r
留言d
发表留言|
222007-8-16113436-22
_____________________________________________________________________________管理员回复:暂无
222007-8-16113423-22
管理员回复:aa
112007-8.16112535.11
管理员回复:dsfdsfsdfsdf
然后,再创建一个Admin.aspx,前台代码如下:
<div>
<asp:RepeaterID="rpt_Message"runat="server"
OnItemCommand="rpt_Message_ItemCommand">
<ItemTemplate>
<tablewidth="600px"style="border:solidlpx
#666666;font-size:10pt;background-color:#f0f0f0">
<tr>
<tdalign="left"width="400px">
<%#Eval("Message")%>
</td>
<tdalign="right"width="200px">
<%#Eval("PostTime")%>-<%#
Eval("UserName")%>
</td>
</tr>
<tr>
<tdcolspan="2"align="right">
<hrwidth="300px"/>
<asp:ButtonID="btn_DeleteMessage"
runat="server"Text="删除留言"
CommandName="DeleteMessage"CommandArgument='<%#
Eval("ID")%>7>
管理员回复:<asp:TextBoxrunat="server"
ID="tb_Reply"TextMode="MultiLine"Width="300px"
Text='<%#Eval("Reply")%>'/>
<asp:ButtonID="btn_SendReply"
runat="server"Text="发表回复"CommandName="SendReply"
CommandArgument='<%#Eval("ID")%>'/>
</td>
</tr>
</table>
<br/>
</ItemTemplate>
</asp:Repeater>
</div>
后台代码:
publicpartialclassAdmin:System.Web.UI.Page
{
GuestBookDataContextctx=new
GuestBookDataContext("server=xxx;database=GuestBook;u
id=xxx;pwd=xxx");
protectedvoidPage_Load(objectsender,EventArgse)
(
if(!IsPostBack)
{
SetBind();
)
)
privatevoidSetBind()
(
rpt_Message.DataSource=fromgbin
ctx.tbGuestBooksorderbygb.PostTimedescendingselect
gb;
rpt_Message.DataBind();
)
protectedvoidrpt_Message_ItemCommand(object
source.RepeaterCommandEventArgse)
(
if(e.CommandName=="DeleteMessage")
{
StreamWritersw=new
StreamWriter(Server.MapPath("log.txt"),true);
ctx.Log=sw;
tbGuestBookgb=ctx.tbGuestBooks.Single(b=>
b.ID==newGuid(e.CommandArgument.ToString()));
ctx.tbGuestBooks.Remove(gb);
ctx.SubmitChanges();
SetBind();
sw.Close();
)
if(e.CommandName=="SendReply")
(
StreamWritersw=new
Streamwriter(Server.MapPath("log.txt"),true);
ctx.Log=sw;
tbGuestBookgb=ctx.tbGuestBooks.Single(b=>
b.ID==newGuid(e.CommandArgument.ToString()));
gb.Reply=
((TextBox)e.Item.FindControl("tb_Reply")).Text;
gb.IsReplied=true;
ctx.SubmitChanges();
SetBind();
sw.Close。;
)
)
运行效果如下图:
在这里,我们通过Single方法获取一条记录,也就是一个
tbGuestBook实例,更新了一些属性后保存也就完成了改这个操作。
删除操作更简单,只需要从表中移除对象。你是不是觉得好像不是在
操作数据库,像在操作内存中的对象。
由于写了日志,看看改和删操作会是怎么样的SQL?
UPDATE[dbo].[tbGuestBook]
SET[IsReplied]=@p4,[Reply]=5P5
WHERE([ID]=@p0)AND([UserName]=@pl)AND([PostTime]
=@p2)AND([Message]=@p3)AND(NOT([IsReplied]=1))
AND([Reply]ISNULL)
--@p0:InputGuid(Size=0;Prec=0;Scale=0)
[00000000-0000-0000-0000-000000000000]
--@pl:InputString(Size=4;Prec=0;Scale=0)[ghgh]
--@p2:InputDateTime(Size=0;Prec=0;Scale=0)
[2007-8-1610:20:09]
--@p3:InputString(Size=3;Prec=0;Scale=0)[ghj]
--@p4:InputBoolean(Size=0;Prec=0;Scale=0)[True]
--@p5:InputString(Size=3;Prec=0;Scale=0)[qqq]
--Context:SqlProvider(Sql2005)Model:
AttributedMetaModelBuild:3.5,20706.1
DELETEFROM[dbo].[tbGuestBook]WHERE([ID]=@p0)AND
([UserName]=@pl)AND([PostTime]=@p2)AND([Message]
=@p3)AND(NOT([IsReplied]=1))AND([Reply]=@p4)
--@p0:InputGuid(Size=0;Prec=0;Scale=0)
[158ec941-13ff-4093-bd8b-9fceael52171]
--@pl:InputString(Size=2;Prec=0;Scale=0)[44]
--@p2:InputDateTime(Size=0;Prec=0;Scale=0)
[2007-8-169:56:19]
--@p3:InputString(Size=2;Prec=0;Scale=0)[44]
--@p4:InputString(Size=3;Prec=0;Scale=0)[222]
--Context:SqlProvider(Sql2005)Model:
AttributedMetaModelBuild:3.5,20706.1
今天就讲到这里,下次将系统介绍查询句法。
一步一步学Linqtosql(四):查询句法
select
描述:查询顾客的公司名、地址信息
查询句法:
var构建匿名类型1=fromcinctx.Customers
selectnew
{
公司名=c.CompanyName,
ifetlt=c.Address
};
对应SQL:
SELECT[t0].[CompanyName],[t0].[Address]
FROM[dbo].[Customers]AS[t0]
描述:查询职员的姓名和雇用年份
查询句法:
var构建匿名类型2=fromempinctx.Employees
selectnew
{
姓名=emp.LastName+
emp.FirstName,
雇用年=
emp.HireDate.Value.Year
};
对应SQL:
SELECT[t0].[LastName]+[t0].[FirstName]AS[value],
DATEPART(Year,[t0].[HireDate])AS[value2]
FROM[dbo].[Employees]AS[t0]
描述:查询顾客的ID以及联系信息(职位和联系人)
查询句法:
var构建匿名类型3=fromcinctx.Customers
selectnew
{
ID=c.Customer工D,
联系信息=new
(
职位=c.ContactTitle,
联系人=c.ContactName
)
};
对应SQL:
SELECT[t0].[CustomerlD][t0].[ContactTitle],
[to].[ContactName]
FROM[dbo].[Customers]AS[t0]
描述:查询订单号和订单是否超重的信息
查询句法:
varselect带条件=fromoinctx.Orders
selectnew
{
订单号=o.OrderlD,
是否超重=o.Freight>100?"
是“:”否”
};
对应SQL:
SELECT[t0].[OrderlD],
(CASE
WHEN[t0].[Freight]>@p0THEN@pl
ELSE@p2
END)AS[value]
FROM[dbo].[Orders]AS[t0]
--@p0:InputCurrency(Size=0;Prec=19;Scale=4)
[100]
--@pl:InputString(Size=1;Prec=0;Scale=0)[是]
--@p2:InputString(Size=1;Prec=0;Scale=0)[否]
where
描述:查询顾客的国家、城市和订单数信息,要求国家是法国并且订
单数大于5
查询句法:
var多条件=fromcinctx.Customers
wherec.Country=="France"&&
c.Orders.Count>5
selectnew
(
国家=c.Country,
城市=c.City,
订单数=c.Orders.Count
};
对应SQL:
SELECT[t0].[Country],[t0].[City],(
SELECTCOUNT(*)
FROM[dbo].[Orders]AS[t2]
WHERE[t2].[CustomerlD]=[t0].[CustomerlD]
)AS[value]
FROM[dbo].[Customers]AS[t0]
WHERE([t0].[Country]=@p0)AND(((
SELECTCOUNT(*)
FROM[dbo].[Orders]AS[tl]
WHERE[tl].[CustomerlD]=[t0].[CustomerlD]
))>@P1)
--@p0:InputString(Size=6;Prec=0;Scale=0)[France]
--@pl:InputInt32(Size=0;Prec=0;Scale=0)[5]
orderby
描述:查询所有没有下属雇员的雇用年和名,按照雇用年倒序,按照
名正序
查询句法:
var排序=fromempinctx.Employees
whereemp.Employees.Count==0
orderbyemp.HireDate.Value.Year
descending,emp.FirstNameascending
selectnew
(
雇用年=emp.HireDate.Value.Year
名=emp.FirstName
};
对应SQL:
SELECTDATEPART(Year,[t0].[HireDate])AS[value],
[t0].[FirstName]
FROM[dbo].[Employees]AS[t0]
WHERE((
SELECTCOUNT(*)
FROM[dbo].[Employees]AS[tl]
WHERE[tl].[ReportsTo]=[t0].[EmployeelD]
))=@P0
ORDERBYDATEPART(Year,[t0].[HireDate])DESC,
[t0].[FirstName]
--@p0:InputInt32(Size=0;Prec=0;Scale=0)[0]
分页
描述:按照每页10条记录,查询第二页的顾客
查询句法:
var分页=(fromcinctx.Customersselect
c).Skip(10).Take(10);
对应SQL:
SELECTTOP10[tl].[CustomerlD],[tl].[CompanyName],
[tl].[ContactName]j[tl].[ContactTitle],
[tl].[Address][tl].[City]j[tl].[Region],
[tl].[PostalCode][tl].[Country]j[tl].[Phone],
[tl].[Fax]
FROM(
SELECTROW_NUMBER()OVER(ORDERBY[t0].[CustomerlD],
[t0].[CompanyName]j[t0].[ContactName],
[t0].[ContactTitle],[t0].[Address],[t0].[City],
[t0].[Region]j[t0].[PostalCode],[t0].[Country],
[t0].[Phone],[t0].[Fax])AS[ROW_NUMBER],
[t0].[CustomerlD],[t0].[CompanyName],
[t0].[ContactName],[t0].[ContactTitle],
[t0].[Address],[t0].[City],[t0].[Region]
[t0].[PostalCode],[t0].[Country],[t0].[Phone],
[t0].[Fax]
FROM[dbo].[Customers]AS[t0]
)AS[tl]
WHERE[tl].[ROW_NUMBER]>@p0
--@p0:InputInt32(Size=0;Prec=0;Scale=0)[10]
分组
描述:根据顾客的国家分组,查询顾客数大于5的国家名和顾客数
查询句法:
var一般分组=fromcinctx.Customers
groupcbyc.Countryintog
whereg.Count()>5
orderbyg.Count()descending
selectnew
{
国家=g.Key,
顾客数=g.Count()
};
对应SQL:
SELECT[tl].[Country],[tl].[value3]AS[顾客数]
FROM(
SELECTCOUNT(*)AS[value],COUNT(*)AS[value2],
COUNT(*)AS[value3][t0].[Country]
FROM[dbo].[Customers]AS[t0]
GROUPBY[t0].[Country]
)AS[tl]
WHERE[tl].[value]>@p0
ORDERBY[tl].[value2]DESC
--@p0:InputInt32(Size=0;Prec=0;Scale=0)[5]
描述:根据国家和城市分组,查询顾客覆盖的国家和城市
查询句法:
var匿名类型分组=fromcinctx.Customers
groupcbynew{c.City,c.Country}
intog
orderbyg.Key.Country,g.Key.City
selectnew
(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业互联网安全防护技术 课件 项目一 工业互联网安全基础建设
- 注册会计师审计中内部控制审计报告的意见类型
- 某食品厂生产质量管理准则
- 某印刷厂生产调度准则
- 2026岚图区域市场岗位社会招聘备考题库附参考答案详解ab卷
- 2026江西鹰潭市邮政分公司现面向社会招聘合同用工B类若干名备考题库含答案详解(夺分金卷)
- 2026安徽安庆市皖宜项目咨询管理有限公司招聘派遣人员3人备考题库及答案详解【各地真题】
- 2026黑龙江佳木斯汤原县退役军人事务局招聘公益性岗位1人备考题库附答案详解(培优a卷)
- 2026吉林四平市事业单位招聘(含专项招聘高校毕业生)25人备考题库(2号)含答案详解(完整版)
- 2026南通师范高等专科学校长期招聘高层次人才15人备考题库附答案详解
- 2026年行政后勤岗位考试试题及答案
- 2026年及未来5年市场数据中国聚苯乙烯行业发展监测及投资战略咨询报告
- 简明精神病评定量表(BPRS)
- 2025年榆林旅投集团招聘(25人)笔试参考题库附带答案详解
- 港口设施保安课件
- 围餐酒席合同协议书
- 山东省2025年中考历史真题试卷三套附同步解析
- 亮化工程安全培训课件
- 农村美食旅游推广创新创业项目商业计划书
- 2025年高一物理下学期期中考试卷含答案
- DB11∕T 1200-2023 超长大体积混凝土结构跳仓法技术规程
评论
0/150
提交评论