zoukankan      html  css  js  c++  java
  • Linq to SQL 查询Tips

    LINQ to SQL当中的灵活的查询操作是其一个很大的优点, 但是当编写较复杂的链接时有时候需要注意一些细节。

    1、LINQ to SQL 提供了 DataLoadOptions用于立即加载对象,避免往返访问数据库,提高查询性能。方法包括:

         LoadWith 方法,用于立即加载与主目标相关的数据。

         AssociateWith 方法,用于筛选为特定关系检索到的对象。


           public List<Entity.RoleDataExtend> GetDataExtendByRoleId(Guid roleid)
            {
               DataLoadOptions dataLoadOption = new DataLoadOptions();
                dataLoadOption.LoadWith<RoleMember>(r => r.RoleId == roleid);
                dataContext.LoadOptions = dataLoadOption;

                var q = from roleData in dataContext.RoleDataExtends
                        join rolemember in dataContext.RoleMembers
                        on  roleData.RoleMemberId equals rolemember.ID
                        into g
                        from o in g.Where( t =>t.RoleId == roleid).DefaultIfEmpty()
                        select new Entity.RoleDataExtend
                        {
                            ID = roleData.ID,
                            RoleMemberId = roleData.RoleMemberId,
                            DataCode = roleData.DataCode,
                            DataName = roleData.DataName,
                            DataObjectCode = roleData.DataObjectCode,
                            DataObjectName = roleData.DataObjectName,
                            DataObjectRemark = roleData.DataObjectRemark,
                            PublicId = roleData.PublicRoleDataExtendId
                        };
                return q.ToList();
            }

    通过使用LoadWith 方法指定应同时检索与主目标RoleDataExtends相关的RoleMember数据,这样后续的查询方法仅访问一次数据库,并可同时获取RoleDataExtends、RoleMember的所有信息。DataLoadOptions适用于有明确外键关联的表连接.

    2、多字段关联, 常规的join…on…equals语句只是适用于单一字段的关联, 如果是多个字段的关联, 则应该使用匿名类的做法。上例使用的join…on…equals语句,并且它们的字段名以及类型必须要完全一致, 常犯的错误就是Nullable类型和非Nullable类型的关联(如int?和int)。例子可参看 http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2930980&SiteID=1

    3、Left Join. 在Linq to SQL当中做Left Join第一要素就是要调用DefaultIfEmpty(), 但关键的地方在于Where查询, 很多时候你需要的Where过滤条件在关联表那端, 也就是说你是要关联一个带过滤条件的表, 而不是关联后再过滤! 这个时候需要使用into关键字生成新的范围变量, 然后对其进行过滤, 而且DefaultIfEmpty必须要在Where执行之后再调用

    4、在查询中使用IN语句,可能大家不知道怎么用,其实很简单

    var result = from s1 in context.Customers where (new string[]  { "UK", "Lisboa" }).Contains(s1.City) select s1;

    欢迎大家扫描下面二维码成为我的客户,为你服务和上云

  • 相关阅读:
    索引,约束
    C# Dictionary 的几种遍历方法
    唯一性约束和唯一性索引的区别
    JS中offsetTop、clientTop、scrollTop、offsetTop各属性介绍
    Dictionary学习笔记嵌套Dictionary的遍历与排序(按Key值)(二)
    Dictionary学习笔记Dictionary定义与输出(一)
    集体智慧编程笔记搜索和排序
    emacs键盘映射
    集体智慧编程笔记推荐系统
    使用SRILM训练大的语言模型
  • 原文地址:https://www.cnblogs.com/shanyou/p/1347597.html
Copyright © 2011-2022 走看看