【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
【linQ】DataContext 入门 , 和 hql , jpql 一样好用的更多相关文章
- LINQ学习入门教程(一)
LINQ 查询简介 Linq 是一跨各种数据源和数据格式的数据模型:它在查询是,始终是把它作为一种对象来操作,可以使用基本相同的编码模型查询和数据的转换XML,SQL,ADO数据等: Li ...
- Linq快速入门——Lambda表达式的前世今生
Linq快速入门——Lambda表达式的前世今生 Lambda表达式其实并不陌生,他的前生就是匿名函数,所以要谈Lambda表达式,就不得不谈匿名函数,要谈匿名函数,那又要不得不谈委托. 何为委托 ...
- 类型“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: ...
- Hibernate入门(六)---------HQL语句
Query: 代表面向对象的一个Hibernate查询操作.在Hibernate中,通常使用session.createQuery()方法接收一个HQL语句,然后调用Query的 list()或uni ...
- Linq快速入门——扩展方法
Linq为我们提供了许多扩展方法,方便我们对数据源进行操作(Where,Select...).即使你不了解算法,也能使用Linq当回牛人.扩展方法本质并不是什么高深的技术,说白了就是一个Static静 ...
- Linq-System.Data.Linq.DataContext不包含采用“0”个参数的构造函数
解决方法: 打开linq to sql 的db文件***.designer.cs,加上下面的代码: 加上这些构造函数之后重新生成就可以了.
- wp8 入门到精通 LINQ to SQL
http://msdn.microsoft.com/zh-cn/library/bb397924.aspx LINQ 查询操作中的类型关系 (C#) 使用一个人类发明快速检索的方法 // Northw ...
- 一步一步学Linq to sql(二):DataContext与实体
DataContext DataContext类型(数据上下文)是System.Data.Linq命名空间下的重要类型,用于把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入 ...
- SpringDataJPA入门就这么简单
一.SpringData入门 在上次学SpringBoot的时候,那时候的教程就已经涉及到了一点SpringData JPA的知识了.当时还是第一次见,觉得也没什么大不了,就是封装了Hibernate ...
随机推荐
- Objective-C ,ios,iphone开发基础:使用GDataXML解析XML文档,(libxml/tree.h not found 错误解决方案)
使用GDataXML解析XML文档 在IOS平台上进行XML文档的解析有很多种方法,在SDK里面有自带的解析方法,但是大多情况下都倾向于用第三方的库,原因是解析效率更高.使用上更方便 这里主要介绍一下 ...
- hdu 4638 树状数组
思路:将查询区间按右节点的升序排列,然后插入第i个数的时候,若nun[i]+1已经插入,那么就update(pre[num[i]+1],-1):pre[]表示的是该数的位置.同样若 num[i]-1存 ...
- hdu 4421 2-SAT问题
思路:我们需要判断是否有满足的a[n],其实也就是对每一个二进制位进行判断,看是否有满足的.那么我们每次取出一个二进制位,这样每一位只有0,1两种状态,就成了比较典型的2-SAT问题了. #inclu ...
- 基本STRUTS标签-学习笔记-Logic标签
BEAN标签(name 是从别处得来的:id是自己的,相当于变量:property相当于变量的值) 前提: String str=request.getParameter("param&qu ...
- Linux 命令 - alias: 设置或显示别名
当一个命令太长或者不符合用户的习惯,那么可以为该命令指定一个符合用户习惯的别名.比如习惯 DOS 命令的用户可以使用 alias md='mkdir' 命令将 md 来替换 mkdir.有时也为经常调 ...
- 【Cocos2d入门教程二】Cocos2d-x基础篇
上一章已经学习了环境的搭建.这一章对基础概念进行掌握.内容大概有: 1.导演 2.场景 3.节点 4.层 4.精灵 1.导演(Director) 导演存在的主要作用: a.环境设定(帧率 初始化ope ...
- C# 保存PictureBox中的图片到数据库,并从数据库读取图片显示到PictrueBox,解决报错 “无效参数”
下面是两段关键代码: /// <summary> /// 将一张图片转换为字节 /// </summary> /// <param name="img" ...
- 接口(interface)
接口(interface) 接口(interface)定义了一个可由类和结构实现的协定.接口可以包含方法.属性.事件和索引器.接口不提供它所定义的成员的实现-它仅指定实现该接口的类或结构必须提供的成员 ...
- BT之下拉菜单
<div class="dropdown"> <button class="btn btn-default dropdown-toggle" ...
- 手机APP与原生APP设计的区别
交互上可以按照原生App的设计方式,效果将越来越接近,主要区别在于: 1.设计中要考虑到浏览器地址栏和工具栏的占有空间,和其对App的操作存在一定的影响. 2.暂时不适合调用系统底层接口,更适合web ...