Linq to SQL: Multi-Join-Tabelle Rückgabetyp nicht durch dbml erzeugt
-
07-07-2019 - |
Frage
Ich versuche, den besten Weg, um herauszufinden, ein einfaches Problem zu umgehen: Ich habe eine einfache LINQ zu zwei Tabellen verknüpfen. Ich weiß, wie die Art für eine Tabelle zurück, da sie die gleiche wie die erzeugte dbml Klasse. Was aber, wenn ich will von beiden Tabellen- Daten zurückgeben nicht da ist ein Weg, um sowohl zurückzukehren und ihre Beziehungen zu nutzen? Sie einen anderen Rückgabetyp erstellen Ich muss wirklich die Daten aus beiden Tabellen zurück? FYI Ich möchte nicht, einen Ausgabeparameter mit dem anderen Tabellenobjekt zurückzukehren; Ich bin auch nicht wirklich daran interessiert, einen anonymen Typ in der Rückkehr. Was ist die beste Praxis Empfehlung?
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;
}
Vielen Dank für jede Hilfe,
Lösung
Wenn Sie Ihre Beziehungen in der LINQ to SQL-Designer dann obige Abfrage muss nicht die Join-Syntax überhaupt definiert haben, einfach zu Fuß den Baum "nach Bedarf, z.
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
);
Hinweis , dass die 2. und 3. ‚aus‘ Aussagen werden mit dem Objekt aus dem vorherigen, da LINQ-to-SQL sollten bereits über die Beziehung kennen.
Ohne mehr über Ihre Beziehungen zu wissen, ist es schwieriger, eine genauere Antwort zu geben. Ich musste einige Annahmen darüber, was die damit verbundenen Eigenschaften waren.
Andere Tipps
Für mich klingt wie das, was Sie suchen ist DataLoadOptions.LoadWith <>. So können Sie Ihre Frage-Objekt zurück und die damit verbundenen Aufgaben werden zur gleichen Zeit durch die definierten Assoziationen bevölkert. So etwas wie folgt aus:
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;
}
}