簡體   English   中英

如何使用內部聯接條件和IN子查詢編寫LINQ查詢

[英]How to write a LINQ query with inner join conditions and IN sub 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
)

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

請讓我知道如何添加邏輯以檢查LINQ查詢中dDateEffective是否為DataItem的最大值。 (即子查詢以從SQL查詢中檢查Max(dDateEffective))

需要從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();

通過以下查詢解決了該問題,

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