zoukankan      html  css  js  c++  java
  • 项目经验之:项目用到LinQ (总结)

    语言集成查询 (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁

    最后一项目用到LinQ ,所以急冲冲都学习了LinQ语书写,下面是我个人在项目中总结用到LinQ 的技术点,说的不好,请大家给出指教

    有人这样说,LinQ就是FrameWork2.0中DataSet的升级版,我也有同感,

    首先在写这遍文章之前我,给大家推荐一款LinQ的编写工具,LinQPad 工具,http://www.linqpad.net/  这个地址有下载,工具说好也有好,说不好就是不能从SQL语句 换成 LinQ 的语法,

    LINQ映射 

    Linq 的映射数据库文件中常有 private System.Nullable<int> 这样的数据类型出现,刚接触的可以不太清楚,  这里是根据你数据库字段来映射的, System.Nullable<int> 映射到你的数据库字段就是 可以为NULL 的 int 类型的字段,这个类型在C#语法中,给这个字段赋值时会存在一个 int? 的出现,会报一个错语,说不引用出错。这是我项目中常出现的问题。

    常用的解决方法是     1.修改数据库字段,将int 类型字段 可为空  改成  不能为空,并给出默认值。再将数据表重新映射 LINQ

                               2.重新定义一个实体类,将int?类型强制转换成int类型。

    LinQ的语法操作是延时的,所在做事务操作时

     using (DBTablesMappingDataContext dc = new DBTablesMappingDataContext(_connString))

    {

      //这里面的任何操作都可以看作是一个事务 不再需要去开如一个事务。

    }

    LinQ Setting 字段存储

    再说说LinQ  中的Setting 字段吧,这个用过Linq的人都知道它的好处,如在设计一张表如学生信息表,如学习爱好,性格,生活经历等这些字段,相信大家在以前的设计理念是将三个字段设计成三个 Nvarchar(8000)类型字段,或者有些设计成 Text 类型字段,这些设计都没错,但都不是很好。

    现在有LinQ,可以将这三个字段都放在 Setting字段中(注意这里,字段的名称必须为Setting),Setting字段设置成 image  类型即可实现数据的存储。如何用C#语法来存储呢?????以后有空再说。用Setting字段存储的数据,缺点是做条件查询时,用Setting作为查询条件就有些复杂了,一般不作条件查询。

      private string _hotelDescription = string.Empty;  //兴趣  

            
    public string HotelDescription { get { return _hotelDescription; } set { _hotelDescription = value; } }

            
    partial void OnLoaded()
            {
                
    byte[] bytes = Setting.ToArray();
                CSetting setting 
    = new CSetting(bytes);

                load(setting);
            }


            
    partial void OnValidate(System.Data.Linq.ChangeAction action)
            {
                CSetting setting 
    = new CSetting();
                save(setting);
                
    byte[] bytes = setting.ToByteArray();
                Setting 
    = new Binary(bytes);
            }

            
    private void save(CSetting setting)
            {
                setting.Set(
    "desc", _hotelDescription);
            }

            
    private void load(CSetting setting)
            {
                _hotelDescription 
    = setting.Get("desc"string.Empty);
            }

    LinQ 中的Union(递归查询,查询父节点下所有节点)

       var query = (from item1 in dc.SysOrganization
                                     
    where (item1.FatherSysOrganizationID == orgId) && item1.IsDel == false
                                     select 
    new SysOrganizationInfo { SysOrganizationID =item1.SysOrganizationID,Name=item1.Name,Code=item1.Code,BaseProvinceID=(int)item1.BaseProvinceID,BaseCityID=(int)item1.BaseCityID})
                                    .Union(
                                         from item2 
    in dc.SysOrganization
                                         join item3 
    in dc.SysOrganization
                                         on item2.FatherSysOrganizationID equals item3.SysOrganizationID
                                         
    where (item2.SysOrganizationID == orgId) && item2.IsDel == false
                                         select 
    new SysOrganizationInfo { SysOrganizationID = item2.SysOrganizationID, Name = item2.Name, Code = item2.Code, BaseProvinceID = (int)item2.BaseProvinceID, BaseCityID = (int)item2.BaseCityID });

    Linq中Join连所子查询结合

      var roles = from aa in(
                                            from a 
    in dc.SysOrganizationRoleUser
                                            join b 
    in dc.SysOrganizationRole on a.SysRoleID equals b.SysRoleID
                                            join c 
    in dc.SysOrganizationRoleFunctionItem on b.SysRoleID equals c.SysRoleID
                                            join d 
    in dc.SysFunctionItem on c.SysFunctionItemID equals d.SysFunctionItemID
                                            join d2 
    in dc.SysFunctionItem on c.SysFunctionItemID equals d2.SysFunctionItemID
                                            
    where a.SysUserID == userID
                                            select d)
                                    from bb 
    in dc.SysFunctionItem
                                    
    where aa.SysFunctionItemID == bb.SysFunctionItemID || aa.FatherFunctionItemID == bb.SysFunctionItemID
                                    select bb;

     LinQ中的左连接查询用到 DefaultIfEmpty() 语法, 

                var svcUser = from a in hdc.SysServiceCenterUser
                              join b 
    in hdc.SysServiceCenter on a.SysServiceCenterID equals b.SysServiceCenterID
                              join c 
    in hdc.SysServicePositionUser on a.SysUserID equals c.SysUserID into pous
                              from c 
    in pous.DefaultIfEmpty()
                              join d 
    in hdc.SysServiceCenterPosition on c.SysServicePositionID equals d.SysServicePositionID into po
                              from d 
    in po.DefaultIfEmpty()
                                                         
    where (_SysServiceCenterID == 0 ? true : a.SysServiceCenterID == _SysServiceCenterID)
                                                         
    && (_SysServicePositionID == 0 ? true : (from w in hdc.SysServicePositionUser where w.SysServicePositionID == _SysServicePositionID select w.SysUserID).Contains(a.SysUserID))
                                                         
    && (_Name == null || _Name.Trim() == "" ? true : a.FullName.Contains(_Name))
                                                         
    && (_Code == null || _Code.Trim() == "" ? true : a.Code == _Code)
                                                          select 
    new Svc
                                                          {
                                                              _SysUserID 
    = (a.SysUserID == null ? 0 : a.SysUserID),
                                                              _SysServiceCenterID 
    = (a.SysServiceCenterID==null?0:(int)a.SysServiceCenterID),
                                                              
    //_SysServicePositionID = (int)c.SysServicePositionID,
                                                              _SvcName = b.Name,
                                                              
    //_PositionName = d.Name,
                                                              _LoginName = a.LoginName,
                                                              _FullName 
    = a.FullName,
                                                              _Code 
    = (a.Code==null?"":a.Code)
                                                          };

    好了,LinQ文章还真难写。

  • 相关阅读:
    boost.asio系列——buffer
    用boost.signal实现多播委托
    boost.asio系列——Timer
    通过boost.date_time进行时间运算
    STL文件读写基础
    boost的字符串处理函数——string algorithm
    boost.asio系列——socket编程
    boost.asio系列——io_service
    boost的字符串处理函数——format
    boost.circular_buffer简介
  • 原文地址:https://www.cnblogs.com/accpfriend/p/LinQ.html
Copyright © 2011-2022 走看看