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

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

public class UserDataContext : DataContext
    {
       public Table<User> Users;

 public UserDataContext()
           : base(@"Data Source=(LocalDB)v11.0;AttachDbFilename=E:CsharpWorkspaceEntityProjectEntityProjectprojectDatabase.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.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如下:

 
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

原文地址:https://www.cnblogs.com/viewcozy/p/4692440.html