Как получить родительские таблицы и дочерние таблицы плюс первичный ключ таблицы, извлекая свойства объекта таблицы?

#asp.net #linq #linq-to-sql #linq-to-entities #linqpad

#asp.net #linq #linq-to-sql #linq-to-entities #linqpad

Вопрос:

У меня есть код ниже (предоставлено sgmoore). Он используется для извлечения таблицы родительской таблицы и таблицы дочерних таблиц.

 void Main()
{
    PropertyInfo[] props = typeof(Product).GetProperties();

    var parents = (from r in props
                  where r.PropertyType.GenericTypeArguments.Count() == 0
                  select r.Name)
                  .ToList().Dump("Parents Tables");

    var children = (from r in props
                   where r.PropertyType.GenericTypeArguments.Count() == 1
                   select r.Name)
                   .ToList().Dump("Children Tables");
}
 

Результатом являются :

Родительские таблицы :

Категория, поставщик

Дочерние таблицы :

Детали заказа, корзины, обзоры

введите описание изображения здесь

Спасибо Sgmoore за приведенный выше код. Прямо сейчас я хочу сделать вывод как имя таблицы parents / children плюс первичный ключ таблицы. Кто может предоставить решение, будет очень признателен.

Ответ №1:

Следующая процедура должна предоставить вам первичный ключ для любой таблицы в вашем DataContext

 public static string GetPrimaryKey(DataContext dc , string tableName)
{        
    var table =  (from t in dc.Mapping.GetTables() where t.TableName == tableName || t.TableName == "["   tableName   "]" select t).Single();

    return (from r in table.RowType.DataMembers where r.IsPrimaryKey select r.Name).Single();
}
 

Итак, вы могли бы использовать это как

 PropertyInfo[] props = typeof(Bank).GetProperties();

var parents = (from r in props 
               where r.PropertyType.GenericTypeArguments.Count() == 0 
               let TableName = r.PropertyType.Name
               select new { Column = r.Name  , TableName  , PrimaryKey = GetPrimaryKey(this, TableName) } )
               .ToList().Dump();

var children = (from r in props 
                where r.PropertyType.GenericTypeArguments.Count() == 1 
                let TableName = r.PropertyType.GenericTypeArguments.Single().Name
                select new { Column = r.Name  , TableName  , PrimaryKey = GetPrimaryKey(this , TableName) } )
               .ToList().Dump();
 

Не уверен, что это лучший способ, но он должен работать.

Комментарии:

1. Большое вам спасибо, Сгмур! Я ценю ваши усилия!