2012-01-16 244 views
0

我卡住了,有人给我推一下。转换SQL查询/子查询LINQ(VB)

这里是我的SQL查询..

SELECT EqID, MakeID, Model, Description, 
    (SELECT MAX(EvDateEnd) AS MaxOfDateEnd 
    FROM tblEvent WHERE (EqID = tblEquip.EqID) AND (Event = 'REG')) AS RegExpire, 
    (SELECT Entity FROM tblEvent AS tblEvent_3 WHERE (EqID = tblEquip.EqID) AND(Event = N'EAE') AND (EvDateEnd IS NULL)) AS IssuedTo 
FROM tblEquip 

我为什么这样做,如果有更好的办法,我所有的耳朵。

tblEquip列出设备行,EqID是PK tblEvent列出了涉及到设备的许多活动,EqID是FK

例如,我想从事件表获得最大EvDateEnd每个记录在tblEquip中,但并非tblEquip中的所有记录都有“REG”事件,而其他记录有多个REG事件。

某些事件(如EAE)我将tblEvent.EvDateEnd字段留空以显示事件是开放和正在进行的,例如向员工(实体)发放车辆。当车辆返回时,我在EvDateEnd中输入日期,基本上关闭事件。

回答

0

使用Linqer,我得到这个输出。因为你以两种不同的方式加入tblEquip,并且我假设第二种方法将保证返回0或1行,那么这种格式就像你会得到的一样好。

from tblequip in db.TblEquip 
select new { 
    tblequip.EqID, 
    tblequip.MakeID, 
    tblequip.Model, 
    tblequip.Description, 
    RegExpire = 
    (from tblevent in db.TblEvent 
    where 
     tblevent.EqID == tblequip.EqID && 
     tblevent.Event == "REG" 
    select new { 
     tblevent.EvDateEnd 
    }).Max(p => p.EvDateEnd), 
    IssuedTo = (System.Int32?) 
    ((from tblevent_3 in db.TblEvent 
    where 
     tblevent_3.EqID == tblequip.EqID && 
     tblevent_3.Event == "EAE" && 
     tblevent_3.EvDateEnd == null 
    select new { 
     tblevent_3.Entity 
    }).First().Entity)