Para su primera pregunta sobre cómo enumerar las tablas en la base de datos, este código las obtendrá para usted, por supuesto, las que se importaron a su EDM que necesariamente no son todas las tablas en su almacén de datos.
var tableNames = context.MetadataWorkspace.GetItems(DataSpace.SSpace)
.Select(t => t.Name)
.ToList();
Este código se producirá un InvalidOperationException con este mensaje:
El espacio 'sspace' no tiene colección asociada
Y eso es porque a diferencia de CSpace, sspace (ssdl) no se carga hasta que esté necesario. y tratar de leerlos con MetadataWorkspace no cuenta como necesario. Es necesario durante la compilación de consultas, luego nuevamente en la materialización del objeto. Entonces, para engañar al MetadataWorkspace y cargarlo para nosotros, debemos ejecutar una consulta como la que se muestra a continuación justo antes de ejecutar la consulta principal que nos da los nombres de las tablas.
string temp = ((ObjectQuery)context.[EntitySetName]).ToTraceString();
Puede leer más desde aquí: Quick Trick for forcing MetadataWorkspace ItemCollections to load
Sin embargo, si su intención es construir una consulta dinámica contra las tablas de tipo, entonces no es necesario perder el tiempo con sspace, hay que obténgalo del CSpace (Modelo Conceptual).A continuación se muestra un código de ejemplo sobre cómo construir una consulta dinámica con tener sólo una parte del nombre de la tabla:
ObjectResult<DbDataRecord> GetAllTypes(string name) {
using (TypeEntities context = new TypeEntities()) {
MetadataWorkspace metadataWorkspace = context.MetadataWorkspace;
EntityContainer container = metadataWorkspace.GetItems<EntityContainer>
(DataSpace.CSpace).First();
string namespaceName = metadataWorkspace.GetItems<EntityType>
(DataSpace.CSpace).First().NamespaceName;
string setName = string.Empty;
string entityName = name + "Type";
EntitySetBase entitySetBase = container.BaseEntitySets
.FirstOrDefault(set => set.ElementType.Name == entityName);
if (entitySetBase != null) {
setName = entitySetBase.Name;
}
EntityType entityType = metadataWorkspace
.GetItem<EntityType>(namespaceName + "." + entityName, DataSpace.CSpace);
StringBuilder stringBuilder = new StringBuilder().Append("SELECT entity ");
stringBuilder
.Append(" FROM " + container.Name.Trim() + "." + setName + " AS entity ");
string eSQL = stringBuilder.ToString();
ObjectQuery<DbDataRecord> query = context.CreateQuery(eSQL);
ObjectResult<DbDataRecord> results = query.Execute(MergeOption.AppendOnly);
return results;
}
}
Código Explicación: Mi suposición era que sus nombres de tabla tipo se terminan en "Tipo" como un postfijo (por ejemplo, ColorType), por lo que puede llamar al GetAllType ("Color") y buscar ColorType EntityObject en su modelo y le dará todos los valores posibles. El código puede parecer aterrador, pero es bastante simple. Básicamente, todo lo que hace es obtener toda la información requerida de MetaData (como nombre de EntitySet, nombre de espacio de nombres, etc.) en función del parámetro del método y luego crear una consulta EntitySQL sobre la marcha, luego ejecutarla y devolver el resultados.
Tablas o entidades? ¿Abstracto o concreto? Nombres o tipos? ¿Por qué? Por favor sea especifico. –
Tablas - eso es todo. Solo tablas. El tipo de cosa que obtendrías al consultar sysobjects en SQL Server. – Michael
¿Desea tablas en su contexto o en la base de datos? – Nix