Много ко многим с несколькими первичными ключами? - PullRequest
0 голосов
/ 14 октября 2010

Положение:

TableParent с 2 primaryKeys, ParentKey1 и ParentKey2 TableChild с 1 primaryKey, ChildKey TableConnector со столбцами ParentKey1, ParentKey2 и ChildKey

Здесь я думаю, что мне следует пойти с моим запросом Linq. Обратите внимание, что я выбираю все дочерние элементы, принадлежащие родителю, поэтому у меня есть его ключи в качестве параметров.

var query = from conn in db.TableConnector
            join child in db.TableChild on conn.ChildKey equals child.childKey
            join par in db.TableParent on conn.ParentKey1 equals par.parentkey1 into connGroup
            from co in connGroup
            where co.ParentKey1 == Parameter1
            Select child;

Ну, я думаю, что это работает до некоторой степени, скажем, если у родителя был только один ключ, я прав?

Полагаю, мне нужно еще присоединиться ко второй группе, но в данный момент я потерян.

Ответы [ 2 ]

1 голос
/ 14 октября 2010

Во-первых, у вас нет двух первичных ключей на вашем столе.Вы можете иметь только один первичный ключ (отсюда и имя первичный).Похоже, у вас есть составной первичный ключ, что означает ключ, состоящий из нескольких столбцов.

Я не уверен, какую проблему вы пытаетесь решить, но этоКажется, что он извлекает все строки TableChild для данного ключа TableParent.Это должно быть что-то вроде этого:

db.TableParent
    .Single(parent => parent.ParentKey1 == key1 && parent.ParentKey2 == key2)
    .TableConnectors.Select(connector => connector.TableChild)

Если ваши таблицы правильно сопоставлены в конструкторе Linq-to-Sql, вам не нужно вручную их объединять - это то, что Linq-to-Sqlгенерация кода делает для вас.

Например, когда у вас есть TableConnector, вы сможете получить для него TableChild строк, используя что-то вроде этого

TableConnector t = db.TableConnectors.First();
List<TableChilds> tableChilds = tableConnector.TableChilds.ToList();
1 голос
/ 14 октября 2010

tableParent нужен только один первичный ключ (его собственный Id), а tableChild нужен один (это Id), для headerTable нужны только два столбца, чтобы заставить работать отношение многие-ко-многим: ParentId и ChildId

ДляДля каждого отношения между родителем и потомком вы просто добавляете одну строку в соединительную таблицу, и для получения результатов попробуйте следующее:

select * from tableParent
inner join connectorTable
on tableParent.Id = connectorTable.ParentId
inner join tableChild
on connectorTable.ChildId = tableChild.Id

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

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