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

转载 2015年11月21日 15:42:07

LINQ和 LINQ to SQL 都已经不是一个新事物了,但是我接触的比较晚,本着绝知此事要躬行的态度,决定写这个系列。

 

本文使用的测试环境是VS 2010,和sql server 2005数据库。

 

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

2.  查询 使用LINQ to SQL做简单查询

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

4.  查询 inner join,left outer join

5.  Linq to SQL中的聚合grouping having

6.  LINQ to SQL查询优化,需要忧虑性能吗?

 

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

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

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

 

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

 

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

1) 添加 Add

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static void Add()
{
    //添加一个Student
    Student aStudent = new Student
    {
        Name = "张小二",
        Hometown = "南海观音院"
    };
    Console.WriteLine("----------begin Add a student");
    using (DbAppDataContext db = new DbAppDataContext())
    {
        db.Log = Console.Out;
        db.Students.InsertOnSubmit(aStudent);
        db.SubmitChanges();
    }
 
    Console.WriteLine("----------End Add a student");
}

输出的sql语句 

1
2
3
4
5
6
7
INSERT INTO [dbo].[Student]([Name], [Hometown])
VALUES (@p0, @p1)
 
SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
-- @p0: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [张小二]
-- @p1: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [南海观音院]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 4.0.30319.1

2) 使用linq to sql执行Edit 编辑操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private static void Edit(int id)
{
    Console.WriteLine("----------begin edit");
    using (DbAppDataContext db = new DbAppDataContext())
    {
        db.Log = Console.Out;
 
    //取出student
    var editStudent = db.Students.SingleOrDefault<Student>(s=>s.ID == id);
 
    if (editStudent == null)
    {
        Console.WriteLine("id错误");
        return;
    }
 
    //修改student的属性
    editStudent.Name = "张小三";
    editStudent.Hometown = "张家口张家寨张家营";
 
    //执行更新操作
    db.SubmitChanges();
 
    }
    Console.WriteLine("---------end edit Student");
}

输出的sql语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT [t0].[ID], [t0].[Name], [t0].[Hometown]
FROM [dbo].[Student] AS [t0]
WHERE [t0].[ID] = @p0
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [6]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 4.0.30319.1
 
UPDATE [dbo].[Student]
SET [Name] = @p3, [Hometown] = @p4
WHERE ([ID] = @p0) AND ([Name] = @p1) AND ([Hometown] = @p2)
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [6]
-- @p1: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [张小二]
-- @p2: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [南海观音院]
-- @p3: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [张小三]
-- @p4: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [张家口张家寨张家营]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 4.0.30319.1

3)使用linq to sql 执行删除操作

执行代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static void Delete(int id)
{
    Console.WriteLine("-----------begin delete a student");
    using (DbAppDataContext db = new DbAppDataContext())
    {
        db.Log = Console.Out;
        //取出student
        var student = db.Students.SingleOrDefault<Student>(s => s.ID == id);
 
        if (student == null)
        {
            Console.WriteLine("student is null");
            return;
        }
 
        db.Students.DeleteOnSubmit(student);
 
        db.SubmitChanges();
    }
    Console.WriteLine("------------end Delete student");
}

生成的sql语句:

1
2
3
4
5
6
7
8
9
10
11
12
SELECT [t0].[ID], [t0].[Name], [t0].[Hometown]
FROM [dbo].[Student] AS [t0]
WHERE [t0].[ID] = @p0
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [6]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 4.0.30319.1
 
DELETE FROM [dbo].[Student] WHERE ([ID] = @p0) AND ([Name] = @p1) AND ([Hometown
] = @p2)
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [6]
-- @p1: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [张小三]
-- @p2: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [张家口张家寨张家营]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 4.0.30319.1

总结:通过以上实践可以看到使用linq to sql执行增改删操作,非常方便,我们甚至不需要学习任何sql相关的知识。

 我有两点疑惑,请各位指点:

1.  是否是在执行update和delete时必须先获得实体,然后才能执行操作,我尝试在update时,不去数据库中获取实体,而是自己声明一个实体,然后去删除,但是失败了

2.  在生成的update和delete的条件语句中包含name=@p和hometown=@p的语句,按理说link to sql已经知道id是唯一的主键,为什么还会传这些没有的条件进去的

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

LINQ和 LINQ to SQL 都已经不是一个新事物了,但是我接触的比较晚,本着绝知此事要躬行的态度,决定写这个系列。   本文使用的测试环境是VS 2010,和sql server ...
  • CsethCRM
  • CsethCRM
  • 2014年03月11日 11:46
  • 8406

一句话,将Linq语句转换为Sql语句

    public IEnumerable ReportView_List(VMB_ReportConditions requiredModel)         {           ...
  • haiyangzhibing
  • haiyangzhibing
  • 2014年07月30日 15:08
  • 3935

Sql to Linq 小工具

这些天写Linq挺烦人的,就上网搜搜可有什么好的sql转Linq的工具,咦,马上就看上了Linqer。 哈哈,介绍一下使用方法吧: 官方下载网站:http://sqltolinq.com/down...
  • swarb
  • swarb
  • 2012年08月13日 14:47
  • 2144

linq To SQl之关联表同步添加数据

//关联表同步添加数据 ,如订单和订单详细;用户和用户组别  protected void gvUser_RowInserting(object sender, DevExpress.Web.Data...
  • longer123123
  • longer123123
  • 2009年03月03日 22:33
  • 2910

使用 LINQPad 将linq转换为 lambda表达式 或者 SQL语句

 一、LINQPad有多用途分析功能,即显示结果的多种选择   1、默认结果视图 由语句返回的对象和文本的简单图形   2、Lambda视图 LINQ表达式转换为可用的Lambda表...
  • whaxrl
  • whaxrl
  • 2016年03月16日 10:48
  • 1265

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

 准备工作,现在数据库中建好测试表Student,这个表只有三个字段ID,Name,Hometown,其中ID为int类型的自增长字段,Name和Howmtown是nvarchar类型 1. ...
  • beautiful_melody
  • beautiful_melody
  • 2015年11月19日 16:15
  • 461

Linq to SQL 增删改查

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We...
  • li185416672
  • li185416672
  • 2014年11月23日 15:40
  • 1751

sqlserver中的in语句在C# linq中的写法

我们知道,在sqlserver中一个in语句通常是这样写的: SELECT * FROM dbo.表名 WHERE SortGID IN ('f30ce6eb-92ab-4ee8-af58-82c7...
  • sxf359
  • sxf359
  • 2017年01月02日 18:48
  • 759

linq to Entities,将查询语句转换为普通的SQL语句

using (testEntities MyEntity = new testEntities()) { #region linq to e...
  • pukuimin1226
  • pukuimin1226
  • 2012年08月27日 14:09
  • 6052

简单的实现一个自定义的Linq to Sql Provider

这两天空闲时间研究了一下Linq 的提供器,简单的实现了一下,代码写的很乱,也没有注释,也没怎么对代码进行设计,因此有很多的临时变量和有些不必要的操作,但注重的是实现原理吧,微软的Linq to SQ...
  • u011964267
  • u011964267
  • 2014年01月09日 15:33
  • 1742
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据[转]
举报原因:
原因补充:

(最多只允许输入30个字)