Для первого вопроса о том, как перечислять таблицы в базе данных, этот код получит их для вас, конечно, те, которые были импортированы в ваш EDM, что обязательно не все таблицы в вашем хранилище данных.
var tableNames = context.MetadataWorkspace.GetItems(DataSpace.SSpace)
.Select(t => t.Name)
.ToList();
Этот код вызовет InvalidOperationException с этим сообщением:
Пространство 'SSpace' не имеет связанного Collection
И это потому, что в отличие от CSpace, SSpace (SSDL) не загружается до тех пор, пока необходимо. и попытка прочитать их с помощью MetadataWorkspace не считается необходимой. Это необходимо во время компиляции запроса, а затем при материализации объекта. Чтобы обмануть MetadataWorkspace, чтобы загрузить его для нас, нам нужно запустить такой запрос, как показано ниже, прежде чем запускать основной запрос, который дает нам имена таблиц.
string temp = ((ObjectQuery)context.[EntitySetName]).ToTraceString();
Вы можете прочитать здесь: Quick Trick for forcing MetadataWorkspace ItemCollections to load
Однако, если ваше намерение состоит в том, чтобы построить динамический запрос к вашим таблицам типа, то вам не нужно возиться с SSpace, вы должны получить его из CSpace (концептуальная модель).Ниже приведен пример кода, о том, как построить динамический запрос с наличием только часть имени таблицы:
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;
}
}
код Пояснение: Мое предположение, что ваши имена таблиц типа оканчиваются в «Тип» как postfix (например, ColorType), поэтому вы можете вызвать GetAllType («Цвет») и искать в вашей модели ColorType EntityObject и предоставить вам все возможные значения. Код может выглядеть страшно, но это довольно простой материал. В основном все, что он делает, это то, что он получает всю необходимую информацию из MetaData (например, имя EntitySet, имя пространства имен и т. Д.) На основе параметра метода, а затем создает запрос EntitySQL «на лету», затем выполняет его и возвращает Результаты.
таблиц или сущностей? Аннотация или конкретный? Имена или типы? Зачем? Пожалуйста, будьте конкретны. –
Столы - все. Просто таблицы. То, что вы получите, запросив sysobjects в SQL Server. – Michael
Вам нужны таблицы в вашем контексте или в БД? – Nix