Link to SQL: Типът връщане на присъединяване към множество таблици не е генериран от dbml

Опитвам се да разбера най-добрия начин да се справя с прост проблем: имам просто LINQ съединение към две таблици. Знам как да върна типа за една таблица, тъй като е същият като генерирания dbml клас. Но какво, ако искам да върна данни и от двете таблици - няма ли начин да върна и двете и да използвам връзките им? Наистина ли трябва да създам друг тип връщане, за да върна данните от двете таблици? FYI - не искам да връщам изходен параметър с другия обект на таблица; Също така не съм много заинтересован от връщането на анонимен тип. Каква е препоръката за най-добра практика?

    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;
    }

Благодаря за всяка помощ,


person mytwocents    schedule 16.09.2009    source източник


Отговори (2)


Ако сте дефинирали връзките си в дизайнера на LINQ към 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 вече трябва да знае за връзката.

Без да знаете повече за вашите взаимоотношения е по-трудно да дадете по-точен отговор. Трябваше да направя някои предположения за това какви са свързаните свойства.

person Timothy Walters    schedule 16.09.2009
comment
Това повдига другия въпрос, ако вече съм присвоил връзки към моите таблици в базата данни (първични ключове, външни ключове), забелязах, че генерираният dbml клас създава атрибут за асоцииране за мен за някои от връзките, не всички. Искате да кажете, че ако тази асоциация на връзката е направена правилно, мога да върна типа родител и да разхождам децата? Това е, което искам! Ще трябва да проуча грешката в асоциирането на dbml, която изглежда имам. - person mytwocents; 17.09.2009
comment
Така се оказва, че проблемът с dbml, генериращ моите атрибути на асоциации за релации, не е защото съм забравил частта от външния ключ на релацията, а защото ми липсваше обозначение на първичен ключ в родителската таблица. Сега мога да обходя обекта на децата от обекта на въпроса и да не се притеснявам за персонализиран тип връщане, който да включва всички данни, които искам. Готино. - person mytwocents; 18.09.2009
comment
@mytwocents: Радвам се да чуя, че след като всичко е настроено правилно, LINQ към SQL е доста хубаво, все още има някои области, които са малко болезнени, но най-накрая получава някои подобрения за VS2010. - person Timothy Walters; 18.09.2009

Звучи ми като това, което търсите, е 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;
    }
}
person Jacob Proffitt    schedule 17.09.2009
comment
Да, това също би свършило работа, но не е ли LoadWith обикновено за неотложено зареждане? - person mytwocents; 18.09.2009
comment
Правилно. Ще извлече всички стойности заедно. - person Jacob Proffitt; 18.09.2009