LINQ SELECT与Max和SUBQUERY中的位置

时间:2014-04-22 20:15:48

标签: c# linq

我正在尝试将以下SQL语句编码到LINQ中,但却在苦苦挣扎。这是SQL声明:

SELECT C.ITM_CD, C.BUY_QTY, C.COST
  FROM CST C
 WHERE C.eff_dt IN (SELECT MAX (D.eff_dt)
                      FROM CST D
                     WHERE D.itm_cd = C.itm_cd
                       AND D.eff_dt <= '22-APR-2014')
 ORDER BY C.itm_cd

这是我的LINQ尝试没有带来任何回报,即使每个eff_dt的日期都少于今天的日期,请记住,在我的“真实”计划中,此日期将会发生变化。

var results = from c in Csts
              let MaxEffDate = (from d in Csts
                                where d.EffDt <= DateTime.Parse("04/22/2014").Date
                                   && d.ItmCd == c.ItmCd
                                select d.EffDt).Max()
              where c.EffDt.Equals(MaxEffDate)
              select new
              {
                  c.ItmCd,
                  c.BuyQty,
                  c.Content
              };

Lambda代码会很棒!因此,对于itm_cd表格中的每个CST行,我希望所有行都返回到具有itm_cd的最长生效日期,与eff_dt <= a certain date一样长。我硬编码了今天的日期,以便我知道每一行应该回来,但我什么都没得到。

我在此网站上看到了很多子选项,但他们始终使用MAX函数而WHERE <=MAX列{{1}}列。

1 个答案:

答案 0 :(得分:5)

我现在无法对此进行真正的测试,但是这样的事情应该让你接近:

var results = Csts.Where(d => 
                         d.EffDt == Csts.Where(x => 
                                               x.ItmCd == d.ItmCd && 
                                               x.EffDt <= DateTime.Now)
                                        .Max(x => x.EffDt))
                  .OrderBy(d => d.ItmCd)
                  .Select(d => new { d.ItmCd, d.BuyQty, d.Content });