【linQ】DataContext 入门 , 和 hql , jpql 一样好用

DataContext 和 LINQ结合后会有巨大的能量

public class UserDataContext : DataContext
{
public Table<User> Users; public UserDataContext()
: base(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=E:\CsharpWorkspace\EntityProject\EntityProject\projectDatabase.mdf;Integrated Security=True")
{ }
} public class EfExample
{ public void SelectRecord()
{ UserDataContext ctx = new UserDataContext(); ctx.DatabaseExists(); var list = from c in ctx.Users select c;
Console.WriteLine(list.Count()); } }
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如下: SELECT COUNT(*) AS [value]
FROM [dbo].[Student] AS [t0]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 4.0.30319. //更多实例 http://www.cnblogs.com/yukaizhao/archive/2010/05/14/linq_to_sql_select_2.html

感觉是不是很简洁,其实现在

ASP.NET ENTITY

也提供类似的访问方式;

另外DataContext还提供很多功能,比如日志功能,通过日志我们可以看到LINQ是如何转化为标准SQL的;例如:

ctx.log = new StreamWriter("日志文件"):

在补充一个功能,

肯能对写单元测试有用,

就是DataContext提供了Create table 和Delete Table 的能力,所以在单元测试的TestBase里能很有用,(以前用castle 的时候,也是利用castLe类似的功能来初始化数据库)

除此以外DataContext还提供了与ADO.NET的接口,可以方便使用传统ado.net的数据访问方式访问关系数据库;

(类似的做法castle ,nhernate 也有)这两种ORM工具还支持HQL和SQL的访问方式;

常用查询:

LINQ:

from c in ctx.Customers select c

HQL:

from Customers c

比较一下,区别还是有的;注意

HQL中Customers 是个领域模型

LINQ中的ctx是DataContext实例;

既然他们都是对象化的查询,那下面的例子:

LINQ:

from c in ctx.Customers  where c.ContractorName == ”tom“

select new {obj = c.ContractorName}

HQL:

from Customers c where c.ContractorName = ?// "?"表示传入的参数

上面的两个例子中的c都可以看成一个对象,

在如:

LINQ:  from c in ctx.Customers          where c.Orders.Count > 0 select c

//Customers 和Orders 是主外键关系

HQL:

from Orders o where o. Customers.ContractorName = ?

//o表示Orders这个对象,它的属性Customers也是一个对象

select Customers from Orders o where o. Customers.ContractorName = ?

//

在HQL中可以通过select 返回其他对象

使用排序:

LINQ:  from c in ctx.Employees  where c.Employees.Count >0 orderby c.EmployeeID descending , c.ReportsTo ascending   select c

注意,因为Employees 有个自链接,[ReportsTo] REFERENCES [EmployeeID],所以有c.Employees.Count >0 这个;

HQL:

from Customers c order by c.EmployeeID desc, c.ReportsTo asc

这里HQL的排序方式和T-SQL一样;

使用分组:

简单分组:

LINQ:

from c in ctx.Employees group c by c.ReportsTo select c

HQL:

from Employees e group by e.EmployeeID

带条件的分组:

LINQ:

from c in ctx.Employees       group c by c.ReportsTo into tmp        where tmp.Count() > 0  select new { 分组数= tmp.Count()}

HQL:

select count(e) from Employees e  group by e.EmployeeID   having  e.EmployeeID = 11

上一篇:使用 Object.create 创建对象,super 关键字,class 关键字


下一篇:文件包含上传漏洞&目录遍历命令执行漏洞