Существует ExecuteSqlCommand
.
context.Database.ExecuteSqlCommand("...")
Однако он ограничен возвратом целого числа, указывающего, сколько строк было затронуто.Никакие строки не будут затронуты, если вы делаете SELECT
, так что он действительно не работает для того, что вы хотите.
Существует также FromSql
, но это работает только натаблицы, а не на уровне базы данных:
context.TableName.FromSql("SELECT ...")
Для того, что вы делаете, лучшим вариантом будет получить DbConnection
из EF и создать свой собственный DbCommand
.Это возвращает то, что вы ожидаете:
var conn = context.Database.GetDbConnection();
if (conn.State.Equals(ConnectionState.Closed)) await conn.OpenAsync();
using (var command = conn.CreateCommand()) {
command.CommandText = @"
SELECT 1 FROM sys.tables AS T
INNER JOIN sys.schemas AS S ON T.schema_id = S.schema_id
WHERE S.Name = 'SchemaName' AND T.Name = 'TableName'";
var exists = await command.ExecuteScalarAsync() != null;
}
Слово предупреждения здесь: не помещайте DbConnection
, который вы получаете от GetDbConnection()
в оператор using
, или не закрывайте его, когда высделанный.Эта связь используется для жизни этого DbContext
экземпляра.Поэтому, если вы закроете его, любые последующие запросы, сделанные EF, не будут выполнены.Также возможно, что он уже был открыт перед вашим кодом, поэтому я поставил там тест, чтобы проверить, не закрыт ли он перед вызовом OpenAsync()
.