Linq to SQL: тип возврата объединения нескольких таблиц не генерируется dbml
-
07-07-2019 - |
Вопрос
Я пытаюсь найти лучший способ справиться с простой проблемой: У меня есть простое соединение LINQ к двум таблицам. Я знаю, как вернуть тип для одной таблицы, так как он совпадает с сгенерированным классом 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;
}
Спасибо за любую помощь,
Решение
Если вы определили свои отношения в конструкторе LINQ-to-SQL, то в приведенном выше запросе вообще не нужен синтаксис объединения, просто при необходимости «ходите по дереву», например:
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
);
Обратите внимание, что 2-й и 3-й операторы 'from' используют объект из предыдущего, поскольку LINQ-to-SQL уже должен знать об этом отношении.
Не зная больше о ваших отношениях, сложнее дать более точный ответ. Мне пришлось сделать некоторые предположения о том, что это были за свойства.
Другие советы
Похоже, вы ищете DataLoadOptions.LoadWith < > ;. Таким образом, вы возвращаете свой объект Question и связанные объекты заполняются одновременно через определенные ассоциации. Примерно так:
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;
}
}