Как вернуть имена столбцов сущности LINQ - PullRequest
1 голос
/ 02 февраля 2011

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

Так что, если моя таблица сущностей LINQ имеет свойства (Last_Name, First_name, Middle_Name), мне нужно вернуть:

Last_name
First_Name
Middle_name

вместо обычного

Smith
John
Joe

Ответы [ 3 ]

2 голосов
/ 03 февраля 2011

Конечно, вы могли бы сделать это с помощью некоторого LINQ-To-Xml непосредственно для файла ".edmx" или ресурсов встроенной модели в скомпилированной сборке.

Приведенный ниже запрос получает имена полей (не столбцов). Если вам нужны столбцы, просто измените запрос на подходящий.

var edmxNS = XNamespace.Get(@"http://schemas.microsoft.com/ado/2007/06/edmx");
var schemaNS = XNamespace.Get(@"http://schemas.microsoft.com/ado/2006/04/edm");

var xd = XDocument.Load(@"{path}\Model.edmx");

var fields =
    from e in xd
        .Elements(edmxNS + "Edmx")
        .Elements(edmxNS + "Runtime")
        .Elements(edmxNS + "ConceptualModels")
        .Elements(schemaNS + "Schema")
        .Elements(schemaNS + "EntityType")
    from p in e
        .Elements(schemaNS + "Property")
    select new
    {
        Entity = e.Attribute("Name").Value,
        Member = p.Attribute("Name").Value,
        Type = p.Attribute("Type").Value,
        Nullable = bool.Parse(p.Attribute("Nullable").Value),
    };
2 голосов
/ 03 февраля 2011

Предположим, вы говорите о таблице Contact в сборке с именем YourAssembly в контексте с именем MyDataContext

Использование отражения на столе

Вы можете использовать отражение, чтобы получить свойства, как если бы вы использовали любой тип

var properties = из свойства в Type.GetType ( "YourAssembly.Contact"). GetProperties () выберите свойство. Имя ;

        foreach (var property in properties)
            Console.WriteLine(property);

Как отмечает shaunmartin, это вернет все свойства, а не только свойства Column Mapped. Также следует отметить, что это вернет только публичные свойства. Вам нужно включить значение BindingFlags для параметра bindingAttr, равного GetProperties , чтобы получить непубличные свойства

Использование метамодели

Вы можете использовать метамодель System.Data.Linq.Mapping , чтобы получить поля (я добавил IsPersistant, чтобы получить только свойства Column Mapped)

        AttributeMappingSource mappping = new System.Data.Linq.Mapping.AttributeMappingSource();
        var model = mappping.GetModel(typeof (MyDataContext));
        var table = model.GetTable(typeof (Contact));

        var qFields= from fields in table.RowType.DataMembers
                where fields.IsPersistent == true
                select fields;

        foreach (var field in qFields)
            Console.WriteLine(field.Name);

Использование отражения из результата запроса

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

        MyDataContextdc = new MyDataContext();
        Table<Contact> contacts = dc.GetTable<Contact>();
        var q = from c in contacts
                select new
                {
                    c.FirstName,
                    c.LastName
                };


        var columns = q.First();
        var properties = (from property in columns.GetType().GetProperties()
                        select property.Name).ToList();
0 голосов
/ 11 июня 2014

Я наткнулся на этот ответ, чтобы решить свою проблему, и воспользовался ответом Конрада Фрикса.Вопрос задал VB.NET, хотя это то, что я программирую. Вот ответы Конрада в VB.NET (они могут быть не идеальным переводом, но они работают):

Пример 1

    Dim PropertyNames1 = From Prprt In Type.GetType("LocalDB.tlbMeter").GetProperties()
                         Select Prprt.Name

Пример 2

    Dim LocalDB2 As New LocalDBDataContext
    Dim bsmappping As New System.Data.Linq.Mapping.AttributeMappingSource()
    Dim bsmodel = bsmappping.GetModel(LocalDB2.GetType())
    Dim bstable = bsmodel.GetTable(LocalDB.tblMeters.GetType())

    Dim PropertyNames2 As IQueryable(Of String) = From fields In bstable.RowType.DataMembers
                                                  Where fields.IsPersistent = True
                                                  Select fields.Member.Name  'IsPersistant to only get the Column Mapped properties

Пример 3

    Dim LocalDB3 As New LocalDBDataContext
    Dim qMeters = From mtr In LocalDB3.tblMeters
                  Select mtr


    Dim FirstResult As tblMeter = qMeters.First()
    Dim PropertyNames3 As List(Of String) = From FN In FirstResult.GetType().GetProperties()
                                            Select FN.Name.ToList()

Для отображения результатов:

    For Each FieldName In PropertyNames1
        Console.WriteLine(FieldName)
    Next

    For Each FieldName In PropertyNames2
        Console.WriteLine(FieldName)
    Next

    For Each FieldName In PropertyNames3
        Console.WriteLine(FieldName)
    Next

Пожалуйста, прочитайте ответ Конрада для заметок по каждому методу!

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