Как я могу получить имена столбцов из модели LINQ? - PullRequest
3 голосов
/ 12 декабря 2008

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

Пример кода:

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

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

Спасибо

Ответы [ 7 ]

15 голосов
/ 12 декабря 2008

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

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> ();
6 голосов
/ 12 декабря 2008

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

var db = new GMPDataContext();
var columnNames = db.Mapping.MappingSource
                    .GetModel(typeof(GMPDataContext))
                    .GetMetaType(typeof(Project))
                    .DataMembers;
3 голосов
/ 12 декабря 2008

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

2 голосов
/ 31 марта 2011

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

var columnNames = db.ColumnNames<Orders>().Where(n => n.Member.GetCustomAttributes(typeof(System.Data.Linq.Mapping.ColumnAttribute), false).FirstOrDefault() != null).Select(n => n.Name);
1 голос
/ 12 декабря 2008

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

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

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

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

0 голосов
/ 07 января 2014

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

        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;
            }
        }
0 голосов
/ 12 декабря 2008

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

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