2017-05-09 4 views
0

Hier bilden, ist ein Beispiel für die SQL IProbleme mit Linq subquery in meinem Anwendungskontext

SELECT 
* FROM assetassignment 
       WHERE asgn_type = 'trc' AND asgn_id = '54490' AND lgh_number <> 3015097 AND mov_number <>2030782 
        and asgn_enddate in (select max(asgn_enddate) FROM assetassignment 
         WHERE asgn_type = 'trc' AND asgn_id = '54490' AND lgh_number <> 3015097 AND mov_number <> 2030782 and asgn_enddate <= '03/19/2017') 

Ich brauche zu konvertieren, dies zu Linq zu Linq konvertieren versuchen. Ich bin mit einem Repository wie folgt:

public async task<AssetAssignment> FindPreviousTrip(string tractorNumber, DateTime endDate, int legNumber,string moveNumber) 
    { 
     using (var ctx = new AssetAssignmentContext(_nameOrConnectionString)) 
     { 
      var previousTrip = from a in ctx.Set<AssetAssignment>() 
            where a.AssignmentType == "TRC" && 
            a.AssignmentId == tractorNumber && 
            a.LegId == legNumber && 
            a.MoveNumber == moveNumber && 
            a.EndDate).in() 



     } 
    } 

Wie man sehen kann ich einen Stich es mache, aber halten Sie auf der Unterabfrage für die EndDate in Anweisung scheitern.

Ich stecke weiter daran, aber jede Hilfe wird geschätzt.

+0

Betrachten zu schaffen. Deine SQL hat mich verwirrt - sie hat '<>' anstelle von '=' für 'lgh_number' (ist das dasselbe wie' LegId'?) Und es hat keine Gruppe für die 'SELECT MAX()', so dass ein Wert zurückgegeben würde und Sie brauchen nicht 'IN' für einen Wert, nur' = '? – NetMage

Antwort

0
var previousTrip = from a in ctx.Set<AssetAssignment>() 
     where a.AssignmentType == "TRC" && 
      a.AssignmentId == tractorNumber && 
      a.LegId != legNumber && 
      a.MoveNumber != moveNumber && 
      a.EndDate == (from b in ctx.Set<AssetAssignment>() 
          where b.AssignmentType == "TRC" && b.AssignmentId == tractorNumber && b.LegId != legNumber && b.MoveNumber != moveNumber && b.EndDate <= new DateTime(2017, 19, 3) 
          select b.EndDate).Max() 
     select a; 

Möglicherweise möchten Sie mit `Contains` eine Variable für die gemeinsame Abfrage

var baseTrip = from a in ctx.Set<AssetAssignment>() 
      where a.AssignmentType == "TRC" && 
       a.AssignmentId == tractorNumber && 
       a.LegId != legNumber && 
       a.MoveNumber != moveNumber 
      select a; 

var previousTrip = from a in baseTrip 
       where a.EndDate == (from b in baseTrip where b.EndDate <= new DateTime(2017, 19, 3) select b.EndDate).Max() 
       select a; 
+0

Vielen Dank für den Vorschlag, diese Arbeit ausgezeichnet. Ich habe nicht über die Variable für die gemeinsame Abfrage nachgedacht. – john