2012-07-03 3 views
2

У меня есть запрос подзапроса SQL, который будет извлекать самую новую запись истории для родительской записи.Преобразование SQL-подзаголовка в LINQ

У меня возникли проблемы превращающего следующее: 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 
} 
+0

нормально, мы можем помочь вам, но то, что вы пробовали? – Jorge

+0

, потому что это sql, а не linq, посмотрите на этот учебник http://msdn.microsoft.com/en-us/vstudio/aa336746.aspx – Jorge

+0

Я добавил Linq, который я пробовал, но не компилирует –

ответ

3

Это в 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 
      } 

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

Это должно сделать трюк.

Кроме того, в первоначальном заявлении SQL, я raccomend изменить

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

часть к статье WHERE, так как нет необходимости в JOIN.

Так, в LINQ вы можете использовать

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

Кроме того, вы можете оптимизировать запрос предварительного расчета стоимости TOP 1 ID:

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

И затем использовать Where request2.ID = top1id.

+0

@Jorge спасибо за код C#, я знаю оба языка, но в основном программа с vb.net – Teejay

+0

, пожалуйста, я тоже но мне совсем не нравится vb.net – Jorge

+0

[OT] Я использую его только из-за некоторых ограничений времени отладки VS с C#, например вы не можете изменять функцию, которая даже содержит только запрос linq. – Teejay

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)); 
+0

Приятно, но очень неясно читателям – Teejay

Смежные вопросы