您的位置:首页 > 数据库

LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据

2010-05-13 20:34 951 查看
LINQ和LINQtoSQL都已经不是一个新事物了,但是我接触的比较晚,本着绝知此事要躬行的态度,决定写这个系列。

本文使用的测试环境是VS2010,和sqlserver2005数据库。

1.从CUD开始,如何使用LINQtoSQL插入、修改、删除数据

2.查询使用LINQtoSQL做简单查询

3.查询延迟加载与立即加载,使用LoadWith和AssociateWith

4.查询innerjoin,leftouterjoin

5.LinqtoSQL中的聚合

6.LINQtoSQL查询优化,需要忧虑性能吗?

第一篇从CUD开始,如何使用LINQtoSQL插入、修改、删除数据

准备工作,现在数据库中建好测试表Student,这个表只有三个字段ID,Name,Hometown,其中ID为int类型的自增长字段,Name和Howmtown是nvarchar类型

1.打开VS2010新建控制台应用程序,然后添加LINQtoSQLClass,命名为DbApp.dbml,新建dbml文件之后,可以打开serverexplorer,建立数据库连接,并将我们新建的表拖到dbml文件中,结果如下图



2.可以通过点击dbml文件空白处,按F4显示dbml属性,可以修改Context和生成实体的命名空间



3.到现在为止VS2010通过工具为我们创建好了数据表对应实体类和数据表操作添,改,删的方法,现在开始实践
1)添加Add

viewsource

print?

01
static
void
Add()
02
{
03
//添加一个Student
04
StudentaStudent=
new
Student
05
{
06
Name=
"张小二"
,
07
Hometown=
"南海观音院"
08
};
09
Console.WriteLine(
"----------beginAddastudent"
);
10
using
(DbAppDataContextdb=
new
DbAppDataContext())
11
{
12
db.Log=Console.Out;
13
db.Students.InsertOnSubmit(aStudent);
14
db.SubmitChanges();
15
}
16
17
Console.WriteLine(
"----------EndAddastudent"
);
18
}
输出的sql语句

viewsource

print?

1
INSERT
INTO
[dbo].[Student]([
Name
],[Hometown])
2
VALUES
(@p0,@p1)
3
4
SELECT
CONVERT
(
Int
,SCOPE_IDENTITY())
AS
[value]
5
--@p0:InputNVarChar(Size=4000;Prec=0;Scale=0)[张小二]
6
--@p1:InputNVarChar(Size=4000;Prec=0;Scale=0)[南海观音院]
7
--Context:SqlProvider(Sql2005)Model:AttributedMetaModelBuild:4.0.30319.1
2)使用linqtosql执行Edit编辑操作

viewsource

print?

01
private
static
void
Edit(
int
id)
02
{
03
Console.WriteLine(
"----------beginedit"
);
04
using
(DbAppDataContextdb=
new
DbAppDataContext())
05
{
06
db.Log=Console.Out;
07
08
//取出student
09
vareditStudent=db.Students.SingleOrDefault<Student>(s=>s.ID==id);
10
11
if
(editStudent==
null
)
12
{
13
Console.WriteLine(
"id错误"
);
14
return
;
15
}
16
17
//修改student的属性
18
editStudent.Name=
"张小三"
;
19
editStudent.Hometown=
"张家口张家寨张家营"
;
20
21
//执行更新操作
22
db.SubmitChanges();
23
24
}
25
Console.WriteLine(
"---------endeditStudent"
);
26
}
viewsource

print?

1
输出的sql语句
viewsource

print?

01
<PRE
class
=brush:sql>SELECT[t0].[ID],[t0].[Name],[t0].[Hometown]
02
FROM[dbo].[Student]AS[t0]
03
WHERE[t0].[ID]=@p0
04
--@p0:InputInt(Size=-1;Prec=0;Scale=0)[6]
05
--Context:SqlProvider(Sql2005)Model:AttributedMetaModelBuild:4.0.30319.1
06
07
UPDATE[dbo].[Student]
08
SET[Name]=@p3,[Hometown]=@p4
09
WHERE([ID]=@p0)AND([Name]=@p1)AND([Hometown]=@p2)
10
--@p0:InputInt(Size=-1;Prec=0;Scale=0)[6]
11
--@p1:InputNVarChar(Size=4000;Prec=0;Scale=0)[张小二]
12
--@p2:InputNVarChar(Size=4000;Prec=0;Scale=0)[南海观音院]
13
--@p3:InputNVarChar(Size=4000;Prec=0;Scale=0)[张小三]
14
--@p4:InputNVarChar(Size=4000;Prec=0;Scale=0)[张家口张家寨张家营]
15
--Context:SqlProvider(Sql2005)Model:AttributedMetaModelBuild:4.0.30319.1
16
</PRE>
3)使用linqtosql执行删除操作
执行代码:

viewsource

print?

01
static
void
Delete(
int
id)
02
{
03
Console.WriteLine(
"-----------begindeleteastudent"
);
04
using
(DbAppDataContextdb=
new
DbAppDataContext())
05
{
06
db.Log=Console.Out;
07
//取出student
08
varstudent=db.Students.SingleOrDefault<Student>(s=>s.ID==id);
09
10
if
(student==
null
)
11
{
12
Console.WriteLine(
"studentisnull"
);
13
return
;
14
}
15
16
db.Students.DeleteOnSubmit(student);
17
18
db.SubmitChanges();
19
}
20
Console.WriteLine(
"------------endDeletestudent"
);
21
}
生成的sql语句:

viewsource

print?

01
SELECT[t0].[ID],[t0].[Name],[t0].[Hometown]
02
FROM[dbo].[Student]AS[t0]
03
WHERE[t0].[ID]=@p0
04
--@p0:InputInt(Size=-1;Prec=0;Scale=0)[6]
05
--Context:SqlProvider(Sql2005)Model:AttributedMetaModelBuild:4.0.30319.1
06
07
DELETEFROM[dbo].[Student]WHERE([ID]=@p0)AND([Name]=@p1)AND([Hometown
08
]=@p2)
09
--@p0:InputInt(Size=-1;Prec=0;Scale=0)[6]
10
--@p1:InputNVarChar(Size=4000;Prec=0;Scale=0)[张小三]
11
--@p2:InputNVarChar(Size=4000;Prec=0;Scale=0)[张家口张家寨张家营]
12
--Context:SqlProvider(Sql2005)Model:AttributedMetaModelBuild:4.0.30319.1
总结:通过以上实践可以看到使用linqtosql执行增改删操作,非常方便,我们甚至不需要学习任何sql相关的知识。
我有两点疑惑,请各位指点:
1.是否是在执行update和delete时必须先获得实体,然后才能执行操作,我尝试在update时,不去数据库中获取实体,而是自己声明一个实体,然后去删除,但是失败了
2.在生成的update和delete的条件语句中包含name=@p和hometown=@p的语句,按理说linktosql已经知道id是唯一的主键,为什么还会传这些没有的条件进去的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: