2009-09-16 6 views
1

J'essaie de trouver la meilleure façon de traiter un problème simple: je simple LINQ joindre à deux tables. Je sais comment retourner le type pour une table, car c'est la même chose que la classe dbml générée. Cependant, que se passe-t-il si je veux renvoyer des données des deux tables - n'y a-t-il pas un moyen de retourner les deux et d'utiliser leurs relations? Dois-je vraiment créer un autre type de retour pour renvoyer les données des deux tables? FYI- Je ne veux pas retourner un paramètre de sortie avec l'autre objet table; Je ne suis pas vraiment intéressé par le retour d'un type anonyme. Quelle est la recommandation de meilleure pratique?LINQ to SQL: Multi-table de jointure retour type non-généré par dbml

public IQueryable<Consumer_Question> GetQuestions(int subCategoryId) 
    { 
     //create DataContext 
     MototoolsDataContext mototoolsDataContext = new MototoolsDataContext(); 
     mototoolsDataContext.Log = Console.Out; 

     var subcategoriestag = (from subCatTag in mototoolsDataContext.Consumer_SubCategoriesTags 
           join tagQuestion in mototoolsDataContext.Consumer_TagQuestions on subCatTag.TagID equals tagQuestion.TagID 
           join question in mototoolsDataContext.Consumer_Questions on tagQuestion.QuestionsID equals question.ID 
           where subCatTag.SubCategoriesID == subCategoryId 
           orderby subCatTag.ID descending 
           select question); 
           //select new { question, tagQuestion }); 

     return subcategoriestag; 
    } 

Merci pour toute aide,

Répondre

1

Si vous avez défini vos relations dans le LINQ-to-SQL Designer alors votre requête ci-dessus n'a pas besoin de la syntaxe de jointure du tout, simplement à pied de l'arbre ' au besoin, par exemple:

var subCategoriesTag = (
    from subCatTag in motoToolsDataContext 
    from tagQuestion in subCatTag.TagQuestions 
    from question in tagQuestion 
    where subCatTag.SubCategoriesID == subcategoryId 
    orderby subCatTag.ID descending 
    select question 
); 

Notez que les 2e et 3e « de » déclarations utilisent l'objet du précédent, puisque LINQ to SQL devraient déjà connaître la relation.

Sans en savoir plus sur vos relations, il est plus difficile de donner une réponse plus exacte. J'ai dû faire quelques hypothèses sur ce que les propriétés liées étaient.

+0

Cela soulève une autre question, si j'ai assigné des relations à mes tables dans la base de données déjà (clés primaires, clés étrangères) J'ai remarqué que la classe générée dbml crée un attribut d'association pour moi une des relations, pas tous. Donc dites-vous que si cette association de relations est faite correctement, que je peux retourner le type de parent et marcher les enfants? C'est ce que je veux! Je vais devoir enquêter sur le bug de l'association dbml que je semble avoir. – mytwocents

+0

Donc il s'avère que le problème avec dbml générant mes attributs d'association pour les relations n'était pas parce que j'ai oublié la partie clé étrangère de la relation, mais parce qu'il me manquait une désignation de clé primaire sur la table parent. Maintenant, je suis capable de traverser l'objet enfants de l'objet question et ne pas m'inquiéter d'un type de retour personnalisé pour inclure toutes les données que je veux. Cool. – mytwocents

+0

@mytwocents: Heureux d'entendre ça, une fois que tout est configuré correctement, LINQ-to-SQL est assez sympa, il y a quand même quelques zones qui sont un peu douloureuses mais qui apporte finalement quelques améliorations pour le VS2010. –

0

me semble ce que vous recherchez est DataLoadOptions.LoadWith <>. De cette façon, vous renvoyez votre objet Question et les objets associés sont remplis en même temps via les associations définies. Quelque chose comme ceci:

public IQueryable<Consumer_Question> GetQuestions(int subCategoryId) 
{ 
    //create DataContext 
    using (MototoolsDataContext mototoolsDataContext = new MototoolsDataContext()) 
    { 
     mototoolsDataContext.Log = Console.Out; 
     DataLoadOptions options = new DataLoadOptions(); 
     options.LoadWith<Consumer_Questions>(q => q.Consumer_TagQuestions); 
     options.LoadWith<Consumer_TagQuestions>(tag => tag.Consumer_SubCategoriesTags); 
     mototoolsDataContext.LoadOptions = options; 

     var questions = (from subCatTag in mototoolsDataContext.Consumer_SubCategoriesTags 
           join tagQuestion in mototoolsDataContext.Consumer_TagQuestions on subCatTag.TagID equals tagQuestion.TagID 
           join question in mototoolsDataContext.Consumer_Questions on tagQuestion.QuestionsID equals question.ID 
           where subCatTag.SubCategoriesID == subCategoryId 
           orderby subCatTag.ID descending 
           select question); 
           //select new { question, tagQuestion }); 

     return questions; 
    } 
} 
+0

Oui, cela fonctionnerait aussi, mais n'est pas "LoadWith" typiquement pour le chargement non différé? – mytwocents

+0

Correct. Il récupèrerait toutes les valeurs ensemble. –