Linq to SQL: type de retour de jointure multi-table non généré par dbml
-
07-07-2019 - |
Question
J'essaie de trouver le meilleur moyen de gérer un problème simple: J'ai un simple LINQ joindre à deux tables. Je sais comment renvoyer le type pour une table, car il est identique à la classe dbml générée. Cependant, si je veux renvoyer des données des deux tables, n'y a-t-il pas moyen de renvoyer 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 renvoyer un paramètre de sortie avec l'autre objet de la table; Je ne suis pas non plus intéressé par le renvoi d'un type anonyme. Quelle est la recommandation de meilleure pratique?
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 votre aide,
La solution
Si vous avez défini vos relations dans le concepteur LINQ-to-SQL, votre requête ci-dessus n'a absolument pas besoin de la syntaxe de jointure. Il suffit simplement de "parcourir l'arborescence" selon les besoins, 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 2ème et 3ème déclarations 'from' utilisent l'objet du précédent, car LINQ-to-SQL devrait déjà connaître la relation.
Sans en savoir plus sur vos relations, il est plus difficile de donner une réponse plus précise. Je devais faire des hypothèses sur les propriétés connexes.
Autres conseils
Cela me semble que ce que vous recherchez est DataLoadOptions.LoadWith < > ;. De cette façon, vous retournez votre objet Question et les objets associés sont renseignés en même temps via les associations définies. Quelque chose comme ça:
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;
}
}