Sie könnten damit zwei Wege gehen. Mit LINQPad (von unschätzbarem Wert, wenn Sie neu in LINQ sind) und einer 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 denke ich, dass die LINQ-Syntax sauberer ist (ich wechsle zwischen den beiden, je nachdem, welche 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 keinen expliziten Join 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önnen 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 explizit an SQL anweisen, alle zugehörigen Elemente auf einmal zu laden (obwohl dies ein fortgeschrittenes Thema sein kann, wenn Sie mit L2S besser vertraut sind). Im folgenden Beispiel heißt es: "Wenn Sie einen Beitrag laden, laden Sie auch alle ihm zugeordneten Datensätze über den Fremdschlüssel, der durch die Eigenschaft 'Post_metas' dargestellt wird."
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 mit einem einzigen Satz DataLoadOptions
für denselben Typ oder mit vielen verschiedenen Typen zu tätigen . Wenn Sie dies jedoch häufig tun, möchten Sie möglicherweise nur das Caching in Betracht ziehen.