linqtosql生成数据库(linq转换为sql语句)

网站建设 13
今天给各位分享linqtosql生成数据库的知识,其中也会对linq转换为sql语句进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!如何在项目中应用LinqToSql数据库事务 众所周知LinqToSql 中我们的事务机制代码变的相对简单了,如以下代码:public bool DeleteDepartment(int departmentId) {

今天给各位分享linqtosql生成数据库的知识,其中也会对linq转换为sql语句进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

如何在项目中应用LinqToSql数据库事务

众所周知LinqToSql 中我们的事务机制代码变的相对简单了,如以下代码:

public bool DeleteDepartment(int departmentId)

{

try

{

DataContext.SystemUser.DeleteOnSubmit(

DataContext.SystemUser.FirstOrDefault(u = u.DepartmentID == departmentId));

DataContext.Department.DeleteOnSubmit(

DataContext.Department.FirstOrDefault(f = f.DepartmentID == departmentId));

//事务机制被封装到SubmitChanges方法内

DataContext.SubmitChanges();

return true;

}

catch

{

return false;

}

}

linqtosql生成的表加不加s

在自动生成的DataContext中有Students属性,它的类型是TableStudent对应数据库中的Student表,我们的查询对象就是它了。

先来一个最简单的Query

1

2

var query = from s in db.Students

select s;

上面的语句可以查询Student表的所有记录,但是它却不同于 SQL语句

1

2

3

4

5

6

7

8

9

10

SELECT [StudentID]

,[Name]

,[Hometown]

,[Gender]

,[Birthday]

,[ClassID]

,[WeightInKg]

,[HeightInCm]

,[Desc]

FROM [Test].[dbo].[Student]

query的数据类型是IQueryableStudent ,其字面意思是Student的可查询实例,通过这个query我们可以做很多种查询,当然包括上面的SQL语句。具体这个IQueryable实例会做那种查询和我们后续代码中如何使用它有关系,下面是几个例子:

1. 使用query返回Student表中的记录数,代码如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

using (var writer = new StreamWriter(@"E:projects.2010TestLINQ2SQL_2linq.sql", false, Encoding.UTF8))

{

//最简单的select

using (DbAppDataContext db = new DbAppDataContext())

{

//设置Log打印到的地方

db.Log = writer;

var query = from s in db.Students

select s;

//返回Student表中的记录数

var cn = query.Count();

}

}

上面query.Count()执行的SQL如下:

1

2

3

SELECT COUNT(*) AS [value]

FROM [dbo].[Student] AS [t0]

-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 4.0.30319.

生成的sql语句很规范,取得Student表中的记录数

2.给这个IQuerable添加条件身高大于130cm,然后执行查询

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

using (var writer = new StreamWriter(@"E:projects.2010TestLINQ2SQL_2linq.sql", false, Encoding.UTF8))

{

//最简单的select

using (DbAppDataContext db = new DbAppDataContext())

{

//设置Log属性,将生成的sql语句保存到文件中

db.Log = writer;

var query = from s in db.Students

select s;

//打印身高大于132cm的Student

foreach (var item in query.Where(s = s.HeightInCm 132))

{

Console.WriteLine("{0}的身高是{1}cm", item.Name, item.HeightInCm);

}

}

}

其SQL语句如下:可以看到linq to sql对sql注入攻击有天然的免疫作用,它自动生成的sql语句是参数化的

1

2

3

4

5

SELECT [t0].[StudentID], [t0].[Name], [t0].[Hometown], [t0].[Gender], [t0].[Birthday], [t0].[ClassID], [t0].[WeightInKg], [t0].[HeightInCm], [t0].[Desc] AS [Desc]

FROM [dbo].[Student] AS [t0]

WHERE [t0].[HeightInCm] @p0

-- @p0: Input Float (Size = -1; Prec = 0; Scale = 0) [132]

-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 4.0.30319.1

我们可以对IQueryable附加条件限制,其实添加这个Where后的query和下面的语句是等价的。

1

2

3

var query = from s in db.Students

where s.HeightInCm 132

select s;

那么如果我们的query实例中已经有条件后再加限制会是什么样子的呢,请看3

3. 在query定义是有身高、体重两个查询条件,在使用query时我们又附加了一个Hometown在“多家营”的条件,看下代码和真实执行的sql情况

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

using (var writer = new StreamWriter(@"E:projects.2010TestLINQ2SQL_2linq.sql", false, Encoding.UTF8))

{

//最简单的select

using (DbAppDataContext db = new DbAppDataContext())

{

//设置Log属性,将生成的sql语句保存到文件中

db.Log = writer;

//查询身高大于132并且体重大于30的Student

var query = from s in db.Students

where s.HeightInCm 132 s.WeightInKg 30

select s;

//在query中用Where附加家乡在多家营的记录

foreach (var item in query.Where(s = s.Hometown == "多家营"))

{

Console.WriteLine("{0}的身高是{1}cm", item.Name, item.HeightInCm);

}

}

}

SQL:

1

2

3

4

5

6

7

SELECT [t0].[StudentID], [t0].[Name], [t0].[Hometown], [t0].[Gender], [t0].[Birthday], [t0].[ClassID], [t0].[WeightInKg], [t0].[HeightInCm], [t0].[Desc] AS [Desc]

FROM [dbo].[Student] AS [t0]

WHERE span style="background-color: #ffff00;"([t0].[Hometown] = @p0)/span AND ([t0].[HeightInCm] @p1) AND ([t0].[WeightInKg] @p2)

-- @p0: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [多家营]

-- @p1: Input Float (Size = -1; Prec = 0; Scale = 0) [132]

-- @p2: Input Float (Size = -1; Prec = 0; Scale = 0) [30]

-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 4.0.30319.1

可以看出后附件的条件并非如我们常规理解附件到条件的最后,而是放到了最前面,这一点有可能对效率造成影响,是需要我们注意的。

通过上面三点可以看出来linq to sql中的IQueryable并非等同于某一个sql语句,其具体要执行的sql语句和具体情况有关系。

在query定义时可以很方便的添加排序规则,可以是一个或者n个,如下语句:

1

2

3

4

5

//查询身高大于132并且体重大于30的Student,并按照StudentID升序排序,按照classID降序排序

var query = from s in db.Students

where s.HeightInCm 132 s.WeightInKg 30

orderby s.StudentID ascending, s.ClassID descending

select s;

linqtosql怎么动态的映射一个数据库

1、映射数据库

映射数据库主要通过Database属性来指定,引用命名空间System.Data.Linq.Mapping;

具体看如下代码:

//这里在连接的时候 如果MyDatabase不指定Database属性,生成的数据库名为MyDbContext类名

//如果指定,则为Database属性里的名称,在这里生成的数据库名为IThinks

[Database(Name = "IThinks")]

public class MyDbContext : DataContext

{

//必须构建此表,不然创建数据库时会提示没有表,无法创建。

public TableLoginUser LoginUsers;

public TableUserBaseInfo UserBaseInfos;

public TableAritcal Articals;

public MyDbContext(string connection) : base(connection)

{

}

如何在网站开发中使用LINQ操作数据库

DBLinqToSqlDataContext Db = new DBLinqToSqlDataContext(); //实例化上下文

Error_Log LOG = new Error_Log();

Exception ee = new Exception();

LOG.Object = ee.Source;

LOG.TargetSite = ee.TargetSite.ToString();

LOG.MessAge = ee.Message;

LOG.Time = DateTime.Now;

Db.Error_Log.InsertOnSubmit(LOG); //插入

Db.SubmitChanges(); //提交 这里运行才能真正的插入数据库

Response.Redirect("GeneralError.aspx");

linq to sql类怎么用

打开VS2010新建控制台应用程序,然后添加LINQ

to

SQL

Class,命名为DbApp.dbml,新建dbml文件之后,可以打开server

explorer,建立数据库连接,并将我们新建的表拖到dbml文件中,

2.

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

3.

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

关于linqtosql生成数据库和linq转换为sql语句的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

linqtosql生成数据库
扫码二维码