как я могу «изучить» отношения между таблицами в LINQ?

Скажем, у меня есть три таблицы:

Office
 ID 

SalespeopleOffice 
 ID 
 OfficeID
 PersonID

People 
 ID 
 ManagerID 

Как в LINQ to SQL начать с таблицы SalespeopleOffices и «перейти» от этой таблицы к таблице People или таблице Office через отношения между таблицами? В частности, не зная, что это за отношения; извлекать данные об отношениях вместо прямого взаимодействия с объектами. Я ищу способ программно анализировать отношения таблиц. В базе данных, с которой я работаю, гораздо больше таблиц, поэтому на самом деле она намного сложнее этой.

В идеале я бы хотел создать для этого сценарий LinqPad.


person jcollum    schedule 07.12.2010    source источник


Ответы (2)


Вы можете использовать отражение для проверки свойств каждого типа в контексте. (В LinqPad контекст this).

  • Значения и строковые свойства будут скалярными полями в таблице,
  • Свойства EntitySet будут представлять отношения [что-то] ко многим, и
  • другие типы будут отношениями [что-то] к одному.

Если вы соедините две стороны отношений, вы сможете выяснить, что [что-то] есть в каждом случае. Имеет ли это смысл?

Изменить

Я просто немного ковырялся, и есть подход получше. Информация о модели доступна через свойство Mapping. Попробуй это:

var tableData = from t in this.Mapping.GetTables()
                select new 
                {
                    t.TableName,
                    Associations = 
                        from a in t.RowType.Associations
                        select new
                    {
                        a.ThisMember.Name,
                        TypeName = a.ThisMember.Type.Name
                    }
                };
tableData.Dump();

Предполагая, что вы активировали автозавершение, вам будет несложно найти именно те данные, которые вас интересуют, изучив свойства этих метаданных.

person StriplingWarrior    schedule 07.12.2010
comment
Да, я думаю, это правильное направление. Отправлю код, если он заработает. - person jcollum; 08.12.2010

Если вы используете LINQ to SQL, ваши экземпляры SalespeopleOffices должны иметь свойства People и Office.

Что-то типа:

var salesPO = dataContext.SalespeopleOffices.First()
var office = salesPO.Office 
var man = salesPO.People
person Rockcoder    schedule 07.12.2010
comment
Не совсем то, что я ищу. Как я могу найти эти отношения, зная их имена заранее? Мне нужно абстрагироваться от уровня объекта, чтобы иметь возможность перемещаться по дереву. - person jcollum; 08.12.2010
comment
т.е. как я могу получить список всех таблиц, у которых есть внешние ключи, указывающие на таблицу People? - person jcollum; 08.12.2010