linqtosql类
① Linq和Linqtosql有什么区别一般做项目用哪种
Linq是微软在.net3.0推出的一种新的数据访问和处理的方式,来解决过去处理集合对象数据所遇到的种种困难。其中在C#3.0和VB9中分别引入了和SQL相似的Linq语法,使得现在操作各种数据对象变得非常容易而且可读性更好。
Linq To Sql是微软默认提供的LinqProvider的一种,其他的还有LinqToDataSet LinqToXml LinqToEntity等。
平时开发项目可以大量的使用linq,他会让你在处理大量集合数据的时候提高效率。而Linq2Sql算是一个ORM框架,可以用来减轻数据访问的负担,如果你知道Hibernate之类的ORM框架的话,就很容易理解他了
② LINQtoSQL和序列化问题,怎么解决
当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化,而序列化的是对象的状态不是类的状态,所以类不会被序列化,像类级别的静态成员也不能被序列化,具体看这篇文章。
③ LINQ技术linqtosqlClassDataContext类在哪个命名空间下 - C#编程 -
using
system.data.linq;?
?这就是LINQ
to
SQL的命名空间using
system.linq;??这是LINQ
to
Objects的命名空间另有System.Data.Objects,是
ADO
Entity
Framework的命名空间
④ C#里面linqtosqlClassDataContext类要引用哪个命名空间或者还要哪个组件
using System;
using System.Linq;
using System.Data;
using System.Data.Linq;
下面博客里有说明
http://tuibianlv001.blog.163.com/blog/static/16756387720106224915926/
⑤ linq to sql类怎么用
打开VS2010新建控制台应用程序,然后添加LINQ
to
SQL
Class,命名为DbApp.dbml,新建dbml文件之后,可以打开server
explorer,建立数据库连接,并将我们新建的表拖到dbml文件中,
2.
可以通过点击dbml文件空白处,按F4显示dbml属性,可以修改Context和生成实体的命名空间
3.
到现在为止VS2010通过工具为我们创建好了数据表对应实体类和数据表操作添,改,删的方法,现在开始实践
⑥ 当数据库表结构发生变化时,linqtosql怎么跟着更新
当数据库表结构发生变化时,linqtosql怎么跟着更新
写三层结构啊:Application、Html(表示层客户端应用程序)------类模块、Dll(逻辑层)------Aplication、Html(表示层服务器设置)-------DataBase(数据库) 在逻辑表示层中可以把数据库设置存储在本地数据里,本地数据把数据库对象作为字符串存储
⑦ linqtosql怎么动态的映射一个数据库
1、映射数据库
映射数据库主要通过Database属性来指定,引用命名空间System.Data.Linq.Mapping;
具体看如下代码:
//这里在连接的时候 如果MyDatabase不指定Database属性,生成的数据库名为MyDbContext类名
//如果指定,则为Database属性里的名称,在这里生成的数据库名为IThinks
[Database(Name = "IThinks")]
public class MyDbContext : DataContext
{
//必须构建此表,不然创建数据库时会提示没有表,无法创建。
public Table<LoginUser> LoginUsers;
public Table<UserBaseInfo> UserBaseInfos;
public Table<Aritcal> Articals;
public MyDbContext(string connection) : base(connection)
{
}
⑧ vs2019怎么添加linqtosql
在VS2019编辑页面【工具】中选择【获取工具和功能】,在弹出的安装页面点击【单个组件】,然后在单个组件中添加【LINQ to SQL工具】,安装完就会有了
⑨ linqtosql生成的表加不加s
在自动生成的DataContext中有Students属性,它的类型是Table<Student>对应数据库中的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的数据类型是IQueryable<Student> ,其字面意思是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.2010\Test\LINQ2SQL_2\linq.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.2010\Test\LINQ2SQL_2\linq.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.2010\Test\LINQ2SQL_2\linq.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;