AshishVishwakarma Ответов: 4

Запрос LINQ для перечисления всех таблиц в Entity Framework


I want a LINQ query to work with Entity Framework to List All the Tables in Datamodel.
i.e. Same as "Select * from SysObjects where xtype='U' " in SQL Server
or "Select * from tab" in Oracle.

4 Ответов

Рейтинг:
31

AshishVishwakarma

Привет,

У меня есть решение по этому поводу, но я нашел его менее полезным в реальном времени, потому что он не динамичен, я получил другое решение, используя отражение.

В этом я нахожу все типы выполняемой в данный момент сборки, поэтому мне приходится вручную удалять программы и TestDBEntities.


using System;
using System.Reflection;

namespace RetrievingORMTablesUsingReflection
{
    class Program
    {
        TestDBEntities DbOrm = new TestDBEntities();
        static void Main(string[] args)
        {
            Assembly A = Assembly.Load(Assembly.GetExecutingAssembly().FullName);
            Type[] Types = A.GetTypes();
            foreach (Type T in Types)
            {
                if (T.Name != "Program" && T.Name != "TestDBEntities")
                    Console.WriteLine(T.Name);
            }
            Console.Read();
        }
    }
}


Рейтинг:
20

norbitrial

Проверьте эту ссылку, есть простой способ:
Linq to Sql, sys таблицы


Рейтинг:
2

Aydin Homay

Привет

Пожалуйста, перейдите по ссылкам :

http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
Понимание LINQ (C#)[^]
http://www.codeproject.com/Articles/628671/LINQ-to-Family-Tree-Prolog-Style

с уважением.


Рейтинг:
1

netfed

Вероятно, лучший способ перечислить сущности, вероятно, таков:

private void PopulateTableNames()
{
    List<string> listOfTables= new List<string>();
    tabeller.Clear();
    var metadata = ((IObjectContextAdapter)db).ObjectContext.MetadataWorkspace;
    var tables = metadata.GetItemCollection(DataSpace.SSpace)
        .GetItems<EntityContainer>()
        .Single()
        .BaseEntitySets
        .OfType<EntitySet>()
        .Where(s => !s.MetadataProperties.Contains("Type")
        || s.MetadataProperties["Type"].ToString() == "Tables");
    var PropertiesInTables = tables.Select(s => s.ElementType.Properties).ToList();
    foreach (var table in tables)
    {
        var tableName = table.MetadataProperties.Contains("Table")
            && table.MetadataProperties["Table"].Value != null
            ? table.MetadataProperties["Table"].Value.ToString()
            : table.Name;
        var tableSchema = table.MetadataProperties["Schema"].Value.ToString();
        listOfTables.Add(tableName);
    }
}


Внимание также должно быть обращено на эту строку в приведенном выше примере кода:
var PropertiesInTables = tables.Select(s => s.ElementType.Properties).ToList();
Этот запрос Linq также дает вам поля (свойства) каждой таблицы.

[От romiller.com]


Dave Kreskowiak

Спросил И ответил четыре года назад.

netfed

Ну, вот и все :-) И для всех остальных, кто читает это; это прекрасное обновление

CHill60

"это прекрасное обновление"... на ваш взгляд. Дело в том, что это форум вопросов и ответов, а не ссылка.

0x01AA

Член клуба примерно с 11 лет, титульный студент. Чего вы ожидаете от других : -)?

netfed

Ага! Я этого не видел. Я обновил свой профиль. Но, тем не менее, вполне возможно, что я стану студентом еще раз в своей жизни :-)

0x01AA

:-)