需要显示出所有的会员信息(即MemberInfo),排序要求按照会员排序表(MemberSort)中会员类型(MemberType)为0的SortNumber列进行排序。可以总结为三条:1.需要显示出所有的会员信息;2.按照会员排序表中的SortNumber列进行排序;3.只按照会员排序表中会员类型为0的会员进行排序。
表结构及相关测试数据脚本:
createtableMemberInfo
(
MemberID int,
MemberName nvarchar(50)
)createtableMemberSort
(
MemberId int,
SortNumber int,
MemberType int)insertintoMemberInfo values(1,'A')insertintoMemberInfo values(2,'B')insertintoMemberInfo values(3,'C')insertintoMemberInfo values(4,'D')insertintoMemberInfo values(5,'E')insertintoMemberSort values(1,5,0)insertintoMemberSort values(2,4,0)insertintoMemberSort values(3,3,1)--Drop table MemberInfo--Drop table MemberSort
采用传统的SQL方式查询代码:
SELECT[t0].[MemberID], [t0].[MemberName]
FROM[dbo].[MemberInfo]AS[t0]
LEFTOUTERJOIN[dbo].[MemberSort]AS[t1]ON([t1].[MemberType]=0) AND([t0].[MemberID]=[t1].[MemberID])ORDERBY (CASE WHEN[t1].[SortNumber]ISNOTNULLTHEN[t1].[SortNumber] ELSE9999 END)
希望在Linq to SQL中获得同样的支持。
首次尝试失败的代码:
vardata =fromm indb.MemberInfo
joins indb.MemberSort onm.MemberID equals s.MemberID &&s.MemberType ==0 intox
fromcx inx.DefaultIfEmpty()
orderby cx.SortNumber.HasValue ? cx.SortNumber.Value : 9999 selectm;
经过修正代码如下:
vardata =fromm indb.MemberInfo
joins indb.MemberSort onm.MemberID equals s.MemberID
intox
fromcx inx.Where(d =>d.MemberType ==0).DefaultIfEmpty()
orderby cx.SortNumber.HasValue ? cx.SortNumber.Value : 9999 selectm;
关键语句即from cx in x.Where(d=>d.MemberType==0).DefaultEmpty(); 即为返回连接组合当中MemberType==0或不存在MemberType值的数据集合。