#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. Большое вам спасибо, Сгмур! Я ценю ваши усилия!