Это - свободное, онлайн: http://www.sqlinform.com/ (требует среды выполнения Java)
Может быть, вы могли бы попробовать сделать шаг назад и посмотреть, что вы хотите сделать с отношением? Я предполагаю, что вы хотите отобразить эту информацию для пользователя, например, "изменено Иэном Галлоуэем 8 часов назад"
Может ли что-то вроде следующего сработать? : -
var users = from u in db.Users
select new
{
/* other stuff... */
AddedTimestamp = u.AddedTimestamp,
AddedDescription = u.AddedByUser.FullName,
ChangedTimestamp = u.ChangedTimestamp,
ChangedDescription = u.ChangedByUser.FullName
};
Я использовал там анонимный тип для (imo) ясности. Вы можете добавить эти свойства к своему типу пользователя, если хотите.
Что касается вашего второго вопроса, ваш обычный LoadWith (x => x.AddedByUser) и т. Д. Должен работать нормально - хотя я предпочитаю сохранять строку описания напрямую в базе данных - у вас есть компромисс между обновлением вашего описания при изменении ChangedByUser.FullName и необходимостью делать что-то сложное и, возможно, нелогичное, если ChangedByUser удаляется (например, ON DELETE CASCADE,
Не уверен, что есть решение этой проблемы с помощью Linq to Sql. Если вы используете Sql Server 2005, вы можете определить (рекурсивную) сохраненную процедуру, которая использует общие табличные выражения для получения желаемого результата, а затем выполнить его с помощью DataContext.ExecuteQuery.
Любые циклы недопустимы . Поскольку LoadWith
или AssociateWith
применяются к каждому типу в контексте, нет внутреннего способа предотвратить бесконечный цикл. Точнее, он просто запутался в том, как создать SQL, поскольку SQL Server не имеет CONNECT BY
и CTE действительно прошли то, что Linq может автоматически генерировать с помощью предоставленной инфраструктуры.
Наилучший вариант, доступный вам, - это вручную выполнить соединение первого уровня с таблицей пользователей для обоих дочерних элементов и анонимного типа, чтобы вернуть их. Извините, это не простое и понятное решение, но это все, что на данный момент доступно с Linq.