2

我有一个 SQL 子选择查询,它将检索父记录的最新历史记录。

我无法将以下内容转换为 LINQ:

SELECT *  
FROM ProductRequests INNER JOIN ProductRequestHistory  
ON ProductRequests.ID = ProductRequestHistory.ProductRequestsID
AND ProductRequestHistory.ID = (SELECT TOP 1 ProductRequestHistory.ID  
    FROM ProductRequestHistory 
    WHERE ProductRequestHistory.ProductRequestsID = ProductRequestHistory.ID  
    ORDER BY ProductRequestHistory.DateCreated DESC)

这是我尝试过的,但无法编译:

from productrequests in db.ProductRequests
join productrequesthistories in db.ProductRequestHistories
  on new { productrequests.ID, Column1 = (Int32?)Convert.ToInt32(
((from productrequesthistories0 in db.ProductRequestHistories
where
  productrequesthistories0.ProductRequestsID == productrequesthistories0.ID
orderby
  productrequesthistories0.ID descending
select new {
  productrequesthistories0.ID
}).Take(1).First().ID)) }
equals new { ID = (System.Int32?)productrequesthistories.ProductRequestsID, Column1 =    productrequesthistories.ID }
select new {
 productrequests.ID,
 productrequests.ProductRequestNumber,
 productrequests.ProjectID,
 Column1 = productrequesthistories.ID,
 productrequesthistories.Title,
 productrequesthistories.Requester,
 productrequesthistories.TFSNumber,
 productrequesthistories.UseCase,
 productrequesthistories.RequestType,
 productrequesthistories.FunctionalModule,
 productrequesthistories.Description,
 productrequesthistories.Reason,
 productrequesthistories.Priority,
 productrequesthistories.Status,
 productrequesthistories.Release,
 productrequesthistories.Estimate,
 productrequesthistories.Wags,
 productrequesthistories.Confidence,
 productrequesthistories.Notes,
 productrequesthistories.RequirementStatus,
 productrequesthistories.RequirementDoco,
 productrequesthistories.AlphaRequired,
 productrequesthistories.Sprint,
 productrequesthistories.Created,
 productrequesthistories.DateChanged,
 productrequesthistories.Checksum,
 productrequesthistories.ProductRequestsID
}
4

2 回答 2

3

This in VB.NET

Dim result = From request in ProductRequests
             Join request2 in ProductRequestHistory
             On request.ID = request2.ProductRequestsID
             And request2.ID = (From request3 in ProductRequestHistory
                                Where request3.ProductRequestsID = request3.ID
                                Order by request3.DateCreated desc
                                Select request3.ID).First()
             Select New With {
                   .request = request
                   .history = request2
             }

In C#

var result = (from request in db.ProductRequests
              Join request2 in ProductRequestHistory
              On request.ID == request2.ProductRequestsID
              && request2.ID == (from request3 in ProductRequestHistory
                                 where request3.ProductRequestsID == request3.ID
                                 orderby request3.DateCreated desc
                                 select request3.ID).First()
              select new {
                     request = request
                     history = request2
              }
             )

That should do the trick.

Also, in the original SQL statement, I raccomend to change the

AND ProductRequestHistory.ID = (SELECT TOP 1 ProductRequestHistory.ID ......

part to a WHERE clause, since it's not necessary to the JOIN.

So, in the LINQ you can use

Where request2.ID = (From request3 in ProductRequestHistory ......

Moreover, you can optimize the query pre-calculating the TOP 1 ID value:

top1id = (From request3 in ProductRequestHistory
          Where request3.ProductRequestsID = request3.ID
          Order by request3.DateCreated desc
          Select request3.ID).First()

And then use Where request2.ID = top1id.

于 2012-07-03T13:48:30.113 回答
0

如果我没有记错的话:

   var rusult = ProductRequests.Join(ProductRequestHistory, 
                                 p => p.ID,
                                 d => d.ProductRequestsID,
                                 (p, d) => p).where(w => w.Id == ProductRequestHistory.OrderByDescending(o=>o.DateCreated).FirstOrDefault(s=>s.ProductRequestsID == s.ID));
于 2012-07-03T13:58:22.347 回答