Как я могу получить имена столбцов из модели LINQ?

Я ищу, чтобы получить список имен столбцов, возвращаемых из модели. Кто-нибудь знает, как это будет сделано, любая помощь будет принята с благодарностью.

Пример кода:

var project = db.Projects.Single(p => p.ProjectID.Equals(Id));

Этот код вернет объект Projects, как я получу список всех имен столбцов в этой модели.

Спасибо

7 ответов

Решение

Извините, у меня нет опыта работы с LINQ.

Это чисто основано на взгляде на MSDN.

DataContext имеет Mapping свойство, которое возвращает экземпляр MetaModel,
MetaModel имеет GetMetaType, который занимает Type, В вашем случае это может быть typeof(Project),
GetMetaType возвращает MetaType который имеет GetDataMember метод, который принимает MemberInfo параметр. Вы должны будете использовать отражение на вашем Projects объект, чтобы получить MemberInfo объект.
MetaDataMember экземпляр возвращен GetDataMember должно быть все, что вам нужно.

Я надеюсь, что я немного в правильном направлении (чисто смотрю на MSDN и пересекаю)

Это было бы неплохо иметь в качестве метода расширения:

public static class LinqExtensions
{
  public static ReadOnlyCollection<MetaDataMember> ColumnNames<TEntity> (this DataContext source)
  {
      return source.Mapping.MappingSource.GetModel (typeof (DataContext)).GetMetaType (typeof (TEntity)).DataMembers;
  }
}

пример:

var columnNames = myDataContext.ColumnNames<Orders> ();

Спасибо, ребята, вы дали мне начать на правильном пути. Я нашел свое решение с помощью следующего кода. Затем я могу перебирать DataMembers и извлекать их индивидуальные свойства, такие как имя, тип и т. Д.

var db = new GMPDataContext();
var columnNames = db.Mapping.MappingSource
                    .GetModel(typeof(GMPDataContext))
                    .GetMetaType(typeof(Project))
                    .DataMembers;

Ваша оболочка Projects будет иметь набор свойств, каждое из которых имеет атрибут [Column]. Так что просто используйте отражение, чтобы перечислить свойства с этим атрибутом.

Используя решение Тодда Смита (+1), вы получаете все свойства (включая наборы сущностей и т. Д.). Чтобы отфильтровать все свойства, не относящиеся к столбцам, это поможет:

var columnNames = db.ColumnNames<Orders>().Where(n => n.Member.GetCustomAttributes(typeof(System.Data.Linq.Mapping.ColumnAttribute), false).FirstOrDefault() != null).Select(n => n.Name);

Вот еще один способ:

        public string[] GetColumnNames()
        {
            var propnames = GetPropertyNames(_context.Users);
            return propnames.ToArray();
        }

        static IEnumerable<string> GetPropertyNames<T>(IEnumerable<T> lst)
        {
            foreach (var pi in typeof(T).GetProperties())
            {
                yield return pi.Name;
            }
        }

Ваши столбцы должны быть сопоставлены как свойства модели вашего проекта. Я не уверен, сможете ли вы получить базовую структуру базы данных при использовании LINQ to SQL. Весь смысл LINQ to SQL - абстрагировать базу данных.

Другие вопросы по тегам