Каков наилучший способ моделирования родительских дочерних отношений, хранящихся в объединяющей таблице в LinqToSql? - PullRequest
0 голосов
/ 17 декабря 2008

Чтобы упростить мою текущую ситуацию, скажем, у меня есть 2 стола (устаревшие, поэтому я не могу коснуться схемы, чтобы играть лучше с Linq)

node
Columns: key_field1, key_field2, [lots of other fields]

node_children
Columns: parent_key_field1, parent_key_field2, child_key_field1, child_key_field2

node_children похож на таблицу соединений has_and_belongs_to_many из Rails ... за исключением того, что оба идентификатора ссылаются на одну и ту же таблицу.

В идеале я хотел бы иметь класс узла, который имеет свойство Children, которое возвращает правильный список? Результаты должны быть эквивалентны

select * from node 
join node_children 
on node.key_field1 = node_children.child_key_field1 and node.key_field2 = node_children.child_key_field2
where node_children.parent_key_field1 = @paramX and node_children.parent_key_field2 = @paramY

Какой лучший способ смоделировать это в Linq to Sql?

1 Ответ

1 голос
/ 06 января 2009

Это то, что я придумал (тоже работает!)
Откройте сгенерированный ORM класс Node MyDatabase.cs

partial class Node
{
  public IEnumerable<Node> Children
  {
    get
    {
      MyDatabaseDataContext dc = new MyDatabaseDataContext();
      return from link in this.ChildLinks
          join node in dc.Nodes on new { Site = link.child_key_field1, ID = link.child_key_field2 } equals new { Site = node.key_field1, ID = node.key_field2 }
          select node;

    }
  }
}
  • Конструктор ORM автоматически добавляет связь между двумя таблицами. Я переименовал свойство класса Node в ChildLinks.
  • (Это привело меня на пару часов к стене). Чтобы объединение LINQ работало с составными ключами, вам необходимо указать имя и порядок каждой части. См. Как: присоединиться с помощью составных ключей

На днях я собираюсь завершить набор статей LINQ Getting Started:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...