需要显示出所有的会员信息(即MemberInfo),排序要求按照会员排序表(MemberSort)中会员类型(MemberType)为0的SortNumber列进行排序。可以总结为三条:1.需要显示出所有的会员信息;2.按照会员排序表中的SortNumber列进行排序;3.只按照会员排序表中会员类型为0的会员进行排序。
表结构及相关测试数据脚本:
{12568658288120}createtable MemberInfo
(
MemberID int,
MemberName nvarchar(50)
)
createtable MemberSort
(
MemberId int,
SortNumber int,
MemberType int
)
insertinto MemberInfo values (1,'A')
insertinto MemberInfo values (2,'B')
insertinto MemberInfo values (3,'C')
insertinto MemberInfo values (4,'D')
insertinto MemberInfo values (5,'E')
insertinto MemberSort values (1,5,0)
insertinto MemberSort values (2,4,0)
insertinto MemberSort values (3,3,1)
--Drop table MemberInfo
--Drop table MemberSort
采用传统的SQL方式查询代码:
{12568658288121}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中获得同样的支持。
首次尝试失败的代码:
{12568658288122}var data =from m in db.MemberInfo
join s in db.MemberSort on m.MemberID equals s.MemberID && s.MemberType ==0
into x
from cx in x.DefaultIfEmpty()
orderby cx.SortNumber.HasValue ? cx.SortNumber.Value : 9999
select m;
经过修正代码如下:
{12568658288123}var data =from m in db.MemberInfo
join s in db.MemberSort on m.MemberID equals s.MemberID
into x
from cx in x.Where(d => d.MemberType ==0).DefaultIfEmpty()
orderby cx.SortNumber.HasValue ? cx.SortNumber.Value : 9999
select m;
关键语句即from cx in x.Where(d=>d.MemberType==0).DefaultEmpty(); 即为返回连接组合当中MemberType==0或不存在MemberType值的数据集合。