Linq a SQL: tipo restituito di join a più tabelle non generato da dbml
-
07-07-2019 - |
Domanda
Sto cercando di capire il modo migliore per gestire un semplice problema: Ho un semplice collegamento LINQ a due tabelle. So come restituire il tipo per una tabella, poiché è uguale alla classe dbml generata. Tuttavia, cosa succede se desidero restituire dati da entrambe le tabelle: non esiste un modo per restituire entrambi e utilizzare le loro relazioni? Devo davvero creare un altro tipo di ritorno per restituire i dati da entrambe le tabelle? Cordiali saluti, non voglio restituire un parametro di output con l'altro oggetto tabella; Inoltre, non sono davvero interessato a restituire un tipo anonimo. Qual è la raccomandazione delle migliori pratiche?
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;
}
Grazie per l'aiuto,
Soluzione
Se hai definito le tue relazioni nella finestra di progettazione LINQ-to-SQL, la tua query sopra non necessita affatto della sintassi del join, semplicemente "cammina l'albero" secondo necessità, ad esempio:
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
);
Si noti che la seconda e la terza istruzione "da" utilizzano l'oggetto della precedente, poiché LINQ-to-SQL dovrebbe già conoscere la relazione.
Senza sapere di più sulle tue relazioni è più difficile dare una risposta più esatta. Ho dovuto fare alcune ipotesi su quali fossero le proprietà correlate.
Altri suggerimenti
Mi sembra che quello che stai cercando sia DataLoadOptions.LoadWith < > ;. In questo modo si restituisce l'oggetto Domanda e gli oggetti correlati vengono popolati contemporaneamente attraverso le associazioni definite. Qualcosa del genere:
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;
}
}