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

【linQ】DataContext 入门 , 和 hql , jpql 一样好用的更多相关文章

  1. LINQ学习入门教程(一)

    LINQ 查询简介       Linq 是一跨各种数据源和数据格式的数据模型:它在查询是,始终是把它作为一种对象来操作,可以使用基本相同的编码模型查询和数据的转换XML,SQL,ADO数据等: Li ...

  2. Linq快速入门——Lambda表达式的前世今生

    Linq快速入门——Lambda表达式的前世今生   Lambda表达式其实并不陌生,他的前生就是匿名函数,所以要谈Lambda表达式,就不得不谈匿名函数,要谈匿名函数,那又要不得不谈委托. 何为委托 ...

  3. 类型“System.Data.Linq.DataContext”在未被引用的程序集中定义。必须添加对程序集“System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”的引用。

    解决方法:添加System.Data.Linq.dll引用 http://www.cnblogs.com/m84641693/archive/2010/07/26/1785100.html http: ...

  4. Hibernate入门(六)---------HQL语句

    Query: 代表面向对象的一个Hibernate查询操作.在Hibernate中,通常使用session.createQuery()方法接收一个HQL语句,然后调用Query的 list()或uni ...

  5. Linq快速入门——扩展方法

    Linq为我们提供了许多扩展方法,方便我们对数据源进行操作(Where,Select...).即使你不了解算法,也能使用Linq当回牛人.扩展方法本质并不是什么高深的技术,说白了就是一个Static静 ...

  6. Linq-System.Data.Linq.DataContext不包含采用“0”个参数的构造函数

    解决方法: 打开linq to sql 的db文件***.designer.cs,加上下面的代码: 加上这些构造函数之后重新生成就可以了.

  7. wp8 入门到精通 LINQ to SQL

    http://msdn.microsoft.com/zh-cn/library/bb397924.aspx LINQ 查询操作中的类型关系 (C#) 使用一个人类发明快速检索的方法 // Northw ...

  8. 一步一步学Linq to sql(二):DataContext与实体

    DataContext DataContext类型(数据上下文)是System.Data.Linq命名空间下的重要类型,用于把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入 ...

  9. SpringDataJPA入门就这么简单

    一.SpringData入门 在上次学SpringBoot的时候,那时候的教程就已经涉及到了一点SpringData JPA的知识了.当时还是第一次见,觉得也没什么大不了,就是封装了Hibernate ...

随机推荐

  1. SQL Server 调优:set statistics profile on

    进行set statistics profile on 设置后 将会返回执行计划表,通过该表,可以理解语句执行的过程,了解SQL Server是否选择了正确的执行计划,进而确定调优方向! 1.返回表字 ...

  2. javaweb学习总结三(枚举)

    一:枚举的概念 定义特定的数据,尤其像一些状态位. 二:定义枚举类 1:定义枚举,其中Grade枚举可以看做类,A.B.C.D.E可以看做对象,因为它定义了有参数的构造方法,所以 对象后面必须带参数. ...

  3. LeetCode 344

    Reverse String Write a function that takes a string as input and returns the string reversed. Exampl ...

  4. 【线性结构上的动态规划】UVa 11584 - Partitioning by Palindromes

    回文串问题.给出一个字符串,问最少可以划分为多少个字符串子串. 对于判断是否为回文串,对于不是很长的字符串,可以采取直接暴力,即从两边向中间收缩判断字符相等. bool is_pali(int l, ...

  5. 使用PL/SQL删除百万条记录的大表

    使用PL/SQL删除百万条记录的大表: 最近开发人员对测试环境数据库进行了压力测试,数据库中产生了大量的脏数据.有几张大表里数据量均在百万甚至千万条的记录数.开发人员现提出需求如下: 只清理其中的部分 ...

  6. Commons JXPath - Modifying Object Graphs

    JXPath 除了可以 XPath 语法访问 JavaBeans.DOM/JDOM,也可以对其属性赋值. 以下面的 JavaBeans 为例. package com.huey.jxpath; imp ...

  7. .net中判断该应用程序是否已经启动,防止重复启动,监控程序启动是否正常

    //获取配置文件中的需要监控项 private static string MonitorServe = ConfigurationSettings.AppSettings["Monitor ...

  8. Xcode6:The file couldn’t be opened because you don’t have permission to view it

    最近为了兼容iOS8升级到Xcode6.0编译之前的工程,结果App无法在真机上运行.报错如下: The file “xxxx.app” couldn’t be opened because you ...

  9. <转载>批处理之FOR语句祥解

    批处理之FOR语句祥解 FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能! 看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号) FOR 参数 %%变量名 IN ...

  10. Redis rdb文件CRC64校验算法 Java实现

    查看RDB文件结构,发现最后的8字节是CRC64校验算得,从文件头开始直到8字节校验码前的FF结束码(含),经过CRC64校验计算发现,貌似最后的8字节是小端模式实现的. 参考redis的crc64实 ...