On peut faire deux choses avec ça. En utilisant LINQPad (précieux si vous êtes novice en matière de LINQ) et une base de données factice, j'ai construit les requêtes suivantes :
Posts.Join(
Post_metas,
post => post.Post_id,
meta => meta.Post_id,
(post, meta) => new { Post = post, Meta = meta }
)
ou
from p in Posts
join pm in Post_metas on p.Post_id equals pm.Post_id
select new { Post = p, Meta = pm }
Dans ce cas particulier, je pense que la syntaxe LINQ est plus propre (je passe d'une syntaxe à l'autre en fonction de celle qui est la plus facile à lire).
Ce que je voudrais souligner, c'est que si vous avez des clés étrangères appropriées dans votre base de données (entre post et post_meta), vous n'avez probablement pas besoin d'une jointure explicite, sauf si vous essayez de charger un grand nombre d'enregistrements. Votre exemple semble indiquer que vous essayez de charger un seul article et ses métadonnées. En supposant qu'il y ait plusieurs enregistrements post_meta pour chaque article, vous pourriez faire ce qui suit :
var post = Posts.Single(p => p.ID == 1);
var metas = post.Post_metas.ToList();
Si vous voulez éviter le problème n+1, vous pouvez demander explicitement à LINQ to SQL de charger tous les éléments liés en une seule fois (bien que cela puisse être un sujet avancé pour quand vous serez plus familier avec L2S). L'exemple ci-dessous indique "lorsque vous chargez un article, chargez également tous les enregistrements qui lui sont associés via la clé étrangère représentée par la propriété 'Post_metas'" :
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
Il est possible de faire de nombreux LoadWith
sur un seul ensemble de DataLoadOptions
pour le même type, ou plusieurs types différents. Si vous faites cela souvent, vous devriez peut-être envisager la mise en cache.
14 votes
Qu'essayez-vous d'accomplir ?
4 votes
Que voulez-vous que la requête fasse dans une phrase ?
6 votes
Vos principaux sélecteurs sont chemin trop compliqué. Si vous souhaitez effectuer une sélection par ID, x=>x.ID suffit.
1 votes
Je voulais récupérer un article dans la base de données et les métadonnées de cet article.