2016-08-09 5 views
1

Ich habe zwei Tabellen und ich brauche Lambda-Ausdruck, um Daten aus der zweiten Tabelle zu bestellen.Wie Verwenden von Orderby aus einer anderen Tabellenspalte mit C# Lambda-Ausdruck

ZB: Tabelle A ist mit Tabelle B mit einer Eins-zu-viele-Beziehung verknüpft. Der Primärschlüssel der Tabelle A ist der Fremdschlüssel in der Tabelle B. Ich muss Daten aus der Tabelle und der Reihenfolge nach Tabelle B Datum Zeitspalte abrufen. kann mir jemand eine Idee dafür bringen. Vielen Dank.

A.cs Datei diesen Code hat,

public partial class A 
{ 
    public A() 
    { 
     this.B = new HashSet<B>(); 
    } 
    public virtual ICollection<B> B { get; set; } 
} 

B.cs Datei diesen Code hat,

public partial class B 
{ 
    public Nullable<long> a_pk { get; set; } 
    public Nullable<System.DateTime> system_date_time { get; set; }  
    public virtual A A { get; set; } 
} 

im Modell cs Dateien Code wie folgt. Danke

+2

Können Sie den Code für Ihre Modelle teilen? – smoksnes

+0

Vermissen Sie nicht eine 'Id' für' A'. Und auch - 'a_pk' ist ein Fremdschlüssel - also wie kann es null sein? –

+0

@smoksnes Code hat die Frage hinzugefügt. Danke. – vishwa

Antwort

1

gehen wird es wahrscheinlich nicht sehr effizient sein, aber Sie könnten so etwas tun:

// Sample data 
var collection = new List<A> 
{ 
    new A() 
    { 
     B = new List<B> 
     { 
      new B { system_date_time = DateTime.Now.AddHours(-1) }, 
      new B { system_date_time = DateTime.Now.AddHours(-2) }, 
      new B { system_date_time = DateTime.Now.AddHours(-3) }, 
     } 
    }, 
    new A() 
    { 
     B = new List<B> 
     { 
      new B { system_date_time = DateTime.Now.AddDays(-1) }, 
      new B { system_date_time = DateTime.Now.AddDays(-2) }, 
      new B { system_date_time = DateTime.Now.AddDays(-3) }, 
     } 
    }, 
    new A() 
    { 
     B = new List<B> 
     { 
      new B { system_date_time = DateTime.Now.AddYears(-1) }, 
      new B { system_date_time = DateTime.Now.AddYears(-2) }, 
      new B { system_date_time = DateTime.Now.AddYears(-3) }, 
     } 
    } 
}; 


var sorted = collection.OrderByDescending(x => x.B.Max(y => y.system_date_time)); 

Die SQL wird in etwa so sein:

Select 
    *, 
    (SELECT 
     MAX([Extent2].[system_date_time]) AS [A1] 
     FROM [dbo].[B] AS [Extent2] 
     WHERE [Var_38].[a_pk ] = [Extent2].[a_pk ]) AS [C1] 
    FROM [dbo].[A] AS [Var_38] 
) AS [Project1] 
ORDER BY [C1] ASC 

Wenn Sie A und umfassen B wollen, dann können Sie etwas tun:

var result = _context.YourATable.Include(x => x.B).OrderByDescending(x => x.B.Max(y => y.system_date_time)); 
+0

@smoksness Danke. Ich werde das auch überprüfen. – vishwa

+0

@GiladGreen, danke für deine Bearbeitung, aber jetzt haben alle 'B' die gleiche' system_date_time', was es schwieriger macht, die Ergebnisse zu überprüfen. – smoksnes

+0

@smoksnes - Och sorry Mann .. verpasste es. Sah die minus Stunden, aber möglicherweise den Rest verpasst haben –

1

Abfragesyntax:

var result = from a in db.A 
      join b in db.B on a.a_pk equals b.a_pk 
      orderby b.system_date_time descending 
      select new { a, b } 

Methode Syntax:

var result = db.A.join(db.B, 
         a => a.a_pk, 
         b => b.a_pk, 
         (a,b) => new { a, b }) 
       .OrderByDescending(item => item.b.system_date_time); 

Wenn Sie nur persent Elemente aus A wollen, dann Smoksnes Antwort ist die Art und Weise

+0

@Gladad Green Danke, ich werde dies versuchen – vishwa

1

Sie können Select verwenden innere Sammlung zu glätten und dann einfach über Plain Collection iterieren und erhalten Sie alle Informationen, die Sie brauchen. Überprüfen Sie this Geige für Code.

+0

yes.i wird es überprüfen. Vielen Dank – vishwa

2

Dies ist die eine, die für mich arbeitete.

var result = _context.A.Include(x => x.B).OrderByDescending(x => x.B.Max(y => y.system_date_time)); 

Dank all

Verwandte Themen