前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linq to SQL 查询Tips

Linq to SQL 查询Tips

作者头像
张善友
发布2018-01-19 11:13:08
9340
发布2018-01-19 11:13:08
举报
文章被收录于专栏:张善友的专栏张善友的专栏

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

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

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

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

代码语言:js
复制

       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语句,可能大家不知道怎么用,其实很简单

代码语言:js
复制
var result = from s1 in context.Customers where (new string[]  { "UK", "Lisboa" }).Contains(s1.City) select s1;
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2008-12-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档