Подтвердить что ты не робот

Можно ли запустить собственный sql с картой сущностей?

Я пытаюсь найти XML-поле внутри таблицы, это не поддерживается с помощью EF.

Без использования чистого Ado.net возможно иметь встроенную поддержку SQL с EF?

4b9b3361

Ответ 1

Для .NET Framework версии 4 и выше: используйте ObjectContext.ExecuteStoreCommand(), если ваш запрос не возвращает никаких результатов, и используйте ObjectContext.ExecuteStoreQuery, если ваш запрос возвращает результаты.

Для предыдущих версий .NET Framework, здесь пример, иллюстрирующий, что делать. Замените ExecuteNonQuery() по мере необходимости, если ваш запрос возвращает результаты.

static void ExecuteSql(ObjectContext c, string sql)
{
    var entityConnection = (System.Data.EntityClient.EntityConnection)c.Connection;
    DbConnection conn = entityConnection.StoreConnection;
    ConnectionState initialState = conn.State;
    try
    {
        if (initialState != ConnectionState.Open)
            conn.Open();  // open connection if not already open
        using (DbCommand cmd = conn.CreateCommand())
        {
            cmd.CommandText = sql;
            cmd.ExecuteNonQuery();
        }
    }
    finally
    {
        if (initialState != ConnectionState.Open)
            conn.Close(); // only close connection if not initially open
    }
}

Ответ 2

Используя Entity Framework 5.0, вы можете использовать ExecuteSqlCommand для выполнения команд с несколькими строками/несколькими командами SQL. Таким образом вам не нужно будет предоставлять какой-либо поддерживающий объект для хранения возвращаемого значения, поскольку метод возвращает int (результат, возвращаемый базой данных после выполнения команды).

Пример:

context.Database.ExecuteSqlCommand(@
"-- Script Date: 10/1/2012 3:34 PM  - Generated by ExportSqlCe version 3.5.2.18
SET IDENTITY_INSERT [Students] ON;

INSERT INTO [Students] ([StudentId],[FirstName],[LastName],[BirthDate],[Address],[Neighborhood],[City],[State],[Phone],[MobilePhone],[Email],[Enrollment],[Gender],[Status]) VALUES (12,N'First Name',N'SecondName',{ts '1988-03-02 00:00:00.000'},N'RUA 19 A, 60',N'MORADA DO VALE',N'BARRA DO PIRAÍ',N'Rio de Janeiro',N'3346-7125',NULL,NULL,{ts '2011-06-04 21:25:26.000'},2,1);

INSERT INTO [Students] ([StudentId],[FirstName],[LastName],[BirthDate],[Address],[Neighborhood],[City],[State],[Phone],[MobilePhone],[Email],[Enrollment],[Gender],[Status]) VALUES (13,N'FirstName',N'LastName',{ts '1976-04-12 00:00:00.000'},N'RUA 201, 2231',N'RECANTO FELIZ',N'BARRA DO PIRAÍ',N'Rio de Janeiro',N'3341-6892',NULL,NULL,{ts '2011-06-04 21:38:38.000'},2,1);
");

Подробнее об этом читайте здесь: Код структуры Entity Сначала: Выполнение SQL файлов при создании базы данных

Ответ 3

Для Entity Framework 5 используйте context.Database.SqlQuery.

И для Entity Framework 4 используйте context.ExecuteStoreQuery следующий код:

 public string BuyerSequenceNumberMax(int buyerId)
    {
        string sequenceMaxQuery = "SELECT TOP(1) btitosal.BuyerSequenceNumber FROM BuyerTakenItemToSale btitosal " +
                                  "WHERE btitosal.BuyerID =  " + buyerId +
                                  "ORDER BY  CONVERT(INT,SUBSTRING(btitosal.BuyerSequenceNumber,7, LEN(btitosal.BuyerSequenceNumber))) DESC";

        var sequenceQueryResult = context.Database.SqlQuery<string>(sequenceMaxQuery).FirstOrDefault();

        string buyerSequenceNumber = string.Empty;

        if (sequenceQueryResult != null)
        {
            buyerSequenceNumber = sequenceQueryResult.ToString();
        }

        return buyerSequenceNumber;
    }

Чтобы вернуть список, используйте следующий код:

 public List<PanelSerialList> PanelSerialByLocationAndStock(string locationCode, byte storeLocation, string itemCategory, string itemCapacity, byte agreementType, string packageCode)
 {
       string panelSerialByLocationAndStockQuery = "SELECT isws.ItemSerialNo,  im.ItemModel " +
        "FROM Inv_ItemMaster im   " +
        "INNER JOIN  " +
        "Inv_ItemStockWithSerialNoByLocation isws  " +
        "   ON im.ItemCode = isws.ItemCode   " +
        "       WHERE isws.LocationCode = '" + locationCode + "' AND  " +
        "   isws.StoreLocation = " + storeLocation + " AND  " +
        "   isws.IsAvailableInStore = 1 AND " +
        "   im.ItemCapacity = '" + itemCapacity + "' AND " +
        "   isws.ItemSerialNo NOT IN ( " +
        "           Select sp.PanelSerialNo From Special_SpecialPackagePriceForResale sp  " +
        "           Where sp.PackageCode = '" + packageCode + "' )";


    return context.Database.SqlQuery<PanelSerialList>(panelSerialByLocationAndStockQuery).ToList();


}

Ответ 4

Начиная с .NET 4 вы можете использовать ExecuteStoreQuery метод:

var list = myDBEntities.ExecuteStoreQuery<MyClass>(MyClass.sql);

где myDBEntities наследуется от ObjectContext.

class MyClass
{
    /* You can change query to more complicated, e.g. with joins */
    public const string sql = @"select [MyTable].[MyField] from [MyTable]";
    public string MyField { get; set; }
}

Обратите внимание, что MyTable - это реальное имя таблицы, а не класс EF.

Ответ 5

Держите его простым

using (var context = new MyDBEntities())
{
    var m = context.ExecuteStoreQuery<MyDataObject>("Select * from Person", string.Empty);
    //Do anything you wonna do with 
    MessageBox.Show(m.Count().ToString());
}

Ответ 6

public class RaptorRepository<T>
    where T : class
{
    public RaptorRepository()
        : this(new RaptorCoreEntities())
    {
    }

    public RaptorRepository(ObjectContext repositoryContext)
    {
        _repositoryContext = repositoryContext ?? new RaptorCoreEntities();
        _objectSet = repositoryContext.CreateObjectSet<T>();
    }

    private ObjectContext _repositoryContext;
    private ObjectSet<T> _objectSet;
    public ObjectSet<T> ObjectSet
    {
        get
        {
            return _objectSet;
        }
    }


    public void DeleteAll()
    {
        _repositoryContext
            .ExecuteStoreCommand("DELETE " + _objectSet.EntitySet.ElementType.Name);
    }
}

Ответ 7

Итак, что мы говорим обо всем этом в 2017 году? Консультации 80k показывают, что выполнение SQL-запроса в EF - это то, что многие люди хотят делать. Но почему? Для какой выгоды?

Джастин, гуру с 20-кратной моей репутацией, в принятом ответе дает нам статический метод, который выглядит как линия для эквивалентного кода ADO. Обязательно скопируйте его, потому что есть несколько тонкостей, чтобы не ошибиться. И вы обязаны объединить свой запрос с параметрами времени выполнения, поскольку нет никаких условий для правильных параметров. Таким образом, все пользователи этого метода будут строить свой SQL со строковыми методами (хрупкой, непроверяемой, sql-инъекцией), и ни один из них не будет тестировать устройство.

Другие ответы имеют одинаковую ошибку, только moreso. SQL похож на двойные кавычки. Возможности SQL-инъекций широко разбросаны. Уверенные сверстники, это абсолютно дикое поведение. Если бы это был С#, который был сгенерирован, произошла пламенная война. Мы даже не принимаем генерацию HTML таким образом, но как-то его ОК для SQL. Я знаю, что параметры запроса не были предметом вопроса, но мы копируем и повторно используем то, что видим, и ответы здесь - это как модели, так и свидетельства того, что делают люди.

Разработал ли EF наш мозг? EF не хочет, чтобы вы использовали SQL, поэтому зачем использовать EF для выполнения SQL.

Желание использовать SQL для общения с реляционной БД - здоровый, нормальный импульс у взрослых. QueryFirst показывает, как это можно было бы сделать разумно, ваш sql в .sql файле, проверенный по мере ввода, с intellisense для таблиц и столбцов. Обертка С# генерируется инструментом, поэтому ваши запросы становятся доступными в коде, с intellisense для ваших входов и результатов. Сильная типизация от конца до конца, без необходимости беспокоиться о типе. Не нужно помнить имя столбца или его индекс. И есть множество других преимуществ... Искушение конкатенации удаляется. Возможность неправильного использования ваших соединений. Все ваши запросы и код, который обращается к ним, постоянно протестированы на интеграцию с вашим Dev DB. Изменения схемы в вашем БД всплывают как ошибки компиляции в вашем приложении. Мы даже создаем метод самопроверки в оболочке, поэтому вы можете тестировать новые версии своего приложения в отношении существующих производственных баз данных, а не ждать, пока телефон не зазвонит. Кому-то все еще нужно убедить?

Отказ от ответственности: я написал QueryFirst: -)