简体   繁体   English

如何使用内部联接条件和IN子查询编写LINQ查询

[英]How to write a LINQ query with inner join conditions and IN sub query

I'm trying to write a LINQ for the following query, 我正在尝试为以下查询编写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
)

My LINQ query is as follows, 我的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
         };

Please let me know how do add the logic to check if the dDateEffective is Max value for the DataItem in the LINQ query. 请让我知道如何添加逻辑以检查LINQ查询中dDateEffective是否为DataItem的最大值。 (ie the sub query to check the Max(dDateEffective) from the SQL query) (即子查询以从SQL查询中检查Max(dDateEffective))

Need to know how to use both "IN" and "MAX" condition in LINQ from the SQL query 需要从SQL查询中了解如何在LINQ中同时使用“ IN”和“ MAX”条件

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();

Resolved the issue with the following query, 通过以下查询解决了该问题,

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
     };

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM