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;
本文来自云栖社区合作伙伴“doNET跨平台”,了解相关信息可以关注“opendotnet”微信公众号