• 【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

  • 相关阅读:
    Jenkins安装2
    11月14 vagrant 虚拟机连接
    11月13 ssh 和 netstat
    Jenkins安装
    11月12号 springboot1.5 引入redis
    11月12号 用户登录输入密码错误达到指定次数后,锁定账户 004
    js模式-观察者模式
    立即执行函数
    vue 获取数据
    在登陆退出时候使用Vuex
  • 原文地址:https://www.cnblogs.com/viewcozy/p/4692440.html
Copyright © 2020-2023  润新知