Man kann das auf zwei Arten angehen. Verwendung von LINQPad (von unschätzbarem Wert, wenn Sie neu in LINQ sind) und eine Dummy-Datenbank, habe ich die folgenden Abfragen erstellt:
Posts.Join(
Post_metas,
post => post.Post_id,
meta => meta.Post_id,
(post, meta) => new { Post = post, Meta = meta }
)
oder
from p in Posts
join pm in Post_metas on p.Post_id equals pm.Post_id
select new { Post = p, Meta = pm }
In diesem speziellen Fall halte ich die LINQ-Syntax für sauberer (ich wechsle zwischen den beiden, je nachdem, was am einfachsten zu lesen ist).
Ich möchte jedoch darauf hinweisen, dass Sie, wenn Sie geeignete Fremdschlüssel in Ihrer Datenbank haben (zwischen post und post_meta), wahrscheinlich keine explizite Verknüpfung benötigen, es sei denn, Sie versuchen, eine große Anzahl von Datensätzen zu laden. Ihr Beispiel scheint darauf hinzudeuten, dass Sie versuchen, einen einzelnen Beitrag und seine Metadaten zu laden. Angenommen, es gibt viele post_meta-Datensätze für jeden Beitrag, dann könnten Sie Folgendes tun:
var post = Posts.Single(p => p.ID == 1);
var metas = post.Post_metas.ToList();
Wenn Sie das n+1-Problem vermeiden möchten, können Sie LINQ to SQL explizit anweisen, alle zugehörigen Elemente in einem Durchgang zu laden (obwohl dies ein Thema für Fortgeschrittene sein könnte, wenn Sie mit L2S besser vertraut sind). Im folgenden Beispiel heißt es: "Wenn Sie einen Beitrag laden, laden Sie auch alle Datensätze, die über den Fremdschlüssel, der durch die Eigenschaft 'Post_metas' repräsentiert wird, mit ihm verbunden sind":
var dataLoadOptions = new DataLoadOptions();
dataLoadOptions.LoadWith<Post>(p => p.Post_metas);
var dataContext = new MyDataContext();
dataContext.LoadOptions = dataLoadOptions;
var post = Posts.Single(p => p.ID == 1); // Post_metas loaded automagically
Es ist möglich, viele LoadWith
Anrufe bei einem einzigen Satz von DataLoadOptions
für denselben Typ oder für viele verschiedene Typen. Wenn Sie dies jedoch häufig tun, sollten Sie eine Zwischenspeicherung in Betracht ziehen.
14 Stimmen
Was wollen Sie erreichen?
4 Stimmen
Was soll die Abfrage in einem Satz bewirken?
6 Stimmen
Ihre wichtigsten Selektoren sind Weg zu kompliziert. Wenn Sie nach der ID auswählen möchten, reicht x=>x.ID aus.
1 Stimmen
Ich wollte einen Beitrag aus der Datenbank und die Metadaten für diesen Beitrag abrufen.