【问题标题】:How to write a LINQ query with inner join conditions and IN sub query如何编写带有内部连接条件和 IN 子查询的 LINQ 查询
【发布时间】:2018-07-22 04:58:06
【问题描述】:

我正在尝试为以下查询编写 LINQ,

Select DI.iDataItemID, 
DI.iDataTypeID,
DIS.iDataItemCurrentStatusID
from OT_BackendUpdate_DataItem DI
INNER JOIN OT_BackendUpdate_DataItemStatus DIS ON DIS.iDataItemID = 
DI.iDataItemID 
INNER JOIN OT_BackendUpdate_RefDataItemStatus ON DIS.iDataItemCurrentStatusID 
= OT_BackendUpdate_RefDataItemStatus.iDataItemStatusID
AND DIS.iDataItemCurrentStatusID = 1 AND DI.iDataTypeID = 8 and 
DIS.dDateEffective IN (
SELECT Max(dDateEffective) FROM OT_BackendUpdate_DataItemStatus Where 
OT_BackendUpdate_DataItemStatus.iDataItemID = DI.iDataItemID
)

我的LINQ查询如下,

result = from dataItem in msaDBContext.OT_BackendUpdate_DataItem
         join dataItemStatus in msaDBContext.OT_BackendUpdate_DataItemStatus 
              on dataItem.iDataItemID equals dataItemStatus.iDataItemID
         join refDataItemStatus in msaDBContext.OT_BackendUpdate_RefDataItemStatus 
              on dataItemStatus.iDataItemCurrentStatusID equals refDataItemStatus.iDataItemStatusID
         where dataItemStatus.iDataItemCurrentStatusID == 1 && && dataItem.iDataTypeID == 8
         select new
         {
          iDataItemID = dataItem.iDataItemID,
          iDataItemCurrentStatusID = dataItemStatus.iDataItemCurrentStatusID,
          iDataTypeID = dataItem.iDataTypeID
         };

请告诉我如何添加逻辑以检查 dDateEffective 是否为 LINQ 查询中 DataItem 的最大值。 (即从 SQL 查询中检查 Max(dDateEffective) 的子查询)

需要知道如何通过 SQL 查询在 LINQ 中同时使用“IN”和“MAX”条件

【问题讨论】:

标签: c# linq


【解决方案1】:

解决了以下查询的问题,

result = from dataItem in msaDBContext.OT_BackendUpdate_DataItem
     join dataItemStatus in msaDBContext.OT_BackendUpdate_DataItemStatus 
          on dataItem.iDataItemID equals dataItemStatus.iDataItemID
     join refDataItemStatus in msaDBContext.OT_BackendUpdate_RefDataItemStatus 
          on dataItemStatus.iDataItemCurrentStatusID equals refDataItemStatus.iDataItemStatusID
     where dataItemStatus.iDataItemCurrentStatusID == 1 && && dataItem.iDataTypeID == 8 
&& (msaDBContext.OT_BackendUpdate_DataItemStatus.Where(x => x.iDataItemID == dataItem.iDataItemID).Select(x=>x.dDateEffective).Max<DateTime>()
                                     ).Equals(dataItemStatus.dDateEffective)
     select new
     {
      iDataItemID = dataItem.iDataItemID,
      iDataItemCurrentStatusID = dataItemStatus.iDataItemCurrentStatusID,
      iDataTypeID = dataItem.iDataTypeID
     };

【讨论】:

    【解决方案2】:
    var res=(from DI in msaDBContext.OT_BackendUpdate_DataItem
                                    .Where(x=>x.iDataTypeID==8)
             join DIS in msaDBContext.OT_BackendUpdate_DataItemStatus
                                     .Where(x=>x.iDataItemCurrentStatusID==1)
                                     .GroupBy(x=>new 
                                                 {            
                                                  x.iDataItemID,
                                                  x.iDataItemCurrentStatusID,
                                                  x.dDateEffective
                                                 })
                                     .Select(x=>new 
                                                {
                                                 iDataItemID=x.key.iDataItemID,
                                 iDataItemCurrentStatusID=x.key.iDataItemCurrentStatusID,
                                                 dDateEffective=x.Max(y=>y.dDateEffective)
                                                 })
             on DI.iDataItemID equals DIS.iDataItemID
             join msaDBContext.OT_BackendUpdate_RefDataItemStatus RDIS
             on DIS.iDataItemCurrentStatusID equals RDIS.iDataItemCurrentStatusID
             select new {DI,DIS})
             .Select(x=>new 
                        {
                          iDataItemID=x.DI.iDataItemID,
                          iDataTypeID=x.DI.iDataTypeID,
                          iDataItemCurrentStatusID=x.DIS.iDataItemCurrentStatusID
                         }).ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 2014-09-29
      相关资源
      最近更新 更多