LINQ将列添加到基本结果集

时间:2013-12-18 21:32:19

标签: c# sql-server linq

我有三个类,CodeCodeContactContact,它们映射到数据库中的表。在我的代码中,类有一个静态方法,它返回您在以下SQL脚本中找到的数据

create table #Contacts
(ContactId int
,Name varchar(50)
,Phone varchar(50)
)
insert into #Contacts(ContactId,Name,Phone)
values   (1,'jon',111 )
        ,(2,'jim',222)
        ,(3,'james',333)
        ,(4,'john',444)
        ,(5,'tim',555)
        ,(6,'jane',666)
go
create table #ContactsCodes
(ContactId int
,CodeId int
)
insert into #ContactsCodes(ContactId,CodeId)
values   (1,1 )
        ,(1,2 )
        ,(1,3 )
        ,(1,4 )
        ,(2,2 )
        ,(2,3 )
        ,(3,1 )
        ,(3,4 )
        ,(4,1 )
        ,(4,5 )
create table #Codes
(CodeId int
,CodeText varchar(50)
)
insert into #Codes
values (1,'Code Red' )
      ,(2,'Code Blue' )
      ,(3,'Code Green' )
      ,(4,'Code Gray' )
      ,(5,'Code Black' )
      ,(6,'code clear' )

我正在寻找一些关于如何获得LINQ代码以获得类似

之类的建议的建议
declare @filter varchar(50) = (select 1)

        select   c.ContactId
                ,c.Name
                ,c.Phone
                ,case when varColumn.ContactId is null
                      then 'Not Present'
                      else 'Present' end as [Code Red]
                ,case when varColumn2.ContactId is null
                      then 'Not Present'
                      else 'Present' end as [Code Blue]
        from Contacts as c
        --****************end of 'cohort' base set of IDs
        --first item in filter list becomes a 
        --column on a DataTable
        left join 
        (
            select distinct cc.ContactId
            from Codes as codes
            left join ContactsCodes as cc
            on cc.CodeId = codes.CodeId
            where codes.CodeId =@filter
        ) as varColumn on varColumn.ContactId = c.ContactId
        --second item in filter becomes another column
        left join 
        (
            select distinct cc.ContactId
            from Codes as codes
            left join ContactsCodes as cc
            on cc.CodeId = codes.CodeId
            where codes.CodeId =@filter+1
        ) as varColumn2 on varColumn2.ContactId = c.ContactId   

所以,假设我有一个IEnumerable,其中包含1,2,3。我想迭代集合并离开连接到Contact.ContactId列,并简单地指示是否在ContactsCodes表中找到了特定的CodeId。以下是运行上述SQL时的结果:

enter image description here

我最终需要在列数据上添加动态非常动态。但就目前而言,任何人都可以提供方向吗?我认为最简单的选择可能是使用LINQ to SQL路由并让左边的内容加入一个存储过程并为列表中的任何内容调用X次,但我欢迎任何建议。

0 个答案:

没有答案