Linq to SQL 查询Tips

时间:2022-04-23
本文章向大家介绍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;