将SQL查询/子查询转换为LINQ(VB)

时间:2012-01-16 03:54:22

标签: sql vb.net linq

我被卡住了,有人请你推。

这是我的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

例如,我想从tblEquip中的每条记录的Events表中获取Max EvDateEnd,但并非tblEquip中的所有记录都有“REG”事件,而其他记录则有多个REG事件。

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

1 个答案:

答案 0 :(得分: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)