복붙노트

[SQL] 그것은 엔티티 프레임 워크와 네이티브 SQL을 실행할 수 있습니까?

SQL

그것은 엔티티 프레임 워크와 네이티브 SQL을 실행할 수 있습니까?

나는 테이블 내에서 XML 필드를 검색하는 것을 시도하고있다, 이것은 EF 지원되지 않습니다.

순수 Ado.net를 사용하지 않고 EF 네이티브 SQL 지원이 가능하다?

해결법

  1. ==============================

    1.쿼리는 어떤 결과를 반환하지 않으며, 쿼리 결과를 반환하는 경우 ObjectContext.ExecuteStoreQuery를 사용하는 경우 사용 ObjectContext.ExecuteStoreCommand () : .NET Framework 버전 4 이상하십시오.

    쿼리는 어떤 결과를 반환하지 않으며, 쿼리 결과를 반환하는 경우 ObjectContext.ExecuteStoreQuery를 사용하는 경우 사용 ObjectContext.ExecuteStoreCommand () : .NET Framework 버전 4 이상하십시오.

    이전 .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. ==============================

    2.엔티티 프레임 워크 5.0을 사용하면 멀티 라인 / 다중 명령 순수 SQL 문을 실행하는 데 ExecuteSqlCommand를 사용할 수 있습니다. 이 방법 당신은 방법은 INT (명령을 실행 한 후 데이터베이스에 의해 반환되는 결과를) 반환 이후 반환 된 값을 저장하기 위해 어떤 지원 객체를 제공 할 필요가 없습니다.

    엔티티 프레임 워크 5.0을 사용하면 멀티 라인 / 다중 명령 순수 SQL 문을 실행하는 데 ExecuteSqlCommand를 사용할 수 있습니다. 이 방법 당신은 방법은 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);
    ");
    

    이에 대한 자세한 내용은 여기를 살펴 : 엔티티 프레임 워크 코드 첫째 : 데이터베이스 생성에 SQL 파일을 실행

  3. ==============================

    3.엔티티 프레임 워크 (5) 사용 context.Database.SqlQuery하십시오.

    엔티티 프레임 워크 (5) 사용 context.Database.SqlQuery하십시오.

    그리고 엔티티 프레임 워크 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. ==============================

    4..NET 4 때문에 당신은 ExecuteStoreQuery 방법을 사용할 수 있습니다 :

    .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. ==============================

    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. ==============================

    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. ==============================

    7.그래서 우리는 2017 년이 모든에 대해 무엇을 말하는가? 80K 상담은 EF의 SQL 요청을 실행하는 사람들의 많은이 원하는 뭔가가 있음을 시사한다. 그런데 왜? 어떤 이익을 위해?

    그래서 우리는 2017 년이 모든에 대해 무엇을 말하는가? 80K 상담은 EF의 SQL 요청을 실행하는 사람들의 많은이 원하는 뭔가가 있음을 시사한다. 그런데 왜? 어떤 이익을 위해?

    저스틴 허용 대답에서 20 시간 내 명성을 가진 전문가는 우리에게 외모는 해당 ADO 코드와 같은 라인 줄 것을 정적 방법을 제공합니다. 오해하지에 약간의 미묘한 차이가 있기 때문에 잘 복사해야합니다. 그리고 당신은 적절한 매개 변수에 대한 규정이 없기 때문에 런타임 매개 변수 쿼리를 연결하는 의무가 있습니다. 이 방법의 모든 사용자가 단위 테스트 될 것입니다 스트링 방법 (깨지기 쉬운, 검증 할, SQL 인젝션), 그리고 그들 중 누구도 자신의 SQL을 구성 할 수 있도록.

    다른 답변 만있는 moreso, 같은 결함을 가지고있다. SQL은 큰 따옴표로 묻었다. SQL 주입 기회 자유롭게 주위에 흩어져. 동료 존경이 절대적으로 야만적 인 동작입니다. 이 C #이 생성되는 있었다면, 불꽃 전쟁이있을 것입니다. 우리는 심지어 어떻게 든 SQL에 대한 확인을 이러한 방법으로 생성 HTML을 허용하지만하지 않습니다. 그 쿼리 매개 변수는 질문의 대상이 아니었다 알고 있지만, 우리는 복사 우리가 무엇을보고 다시 사용하고, 여기에 대한 답변은 모델과 민속 무엇을하고 있는지에 성약 상표입니다.

    EF는 우리의 두뇌 녹은 적이 있습니까? 사용 EF는 SQL을 할 이유 EF 그래서, 당신은 SQL을 사용하지 않습니다.

    관계형 DB 얘기에 SQL을 사용하고자하는 것은 성인의 건강하고 정상적인 충동이다. QueryFirst 프로그램이 입력 할 때 테이블과 컬럼에 대한 인텔리로, 검증, .SQL 파일에서 지능적으로 SQL을 수행하는 방법. 쿼리 코드에서 검색 가능하게하므로 C #을 래퍼가 당신의 입력과 결과에 대한 인텔리로, 도구에 의해 생성됩니다. 어느 유형에 대해 걱정할 필요없이, 강력한 입력을 끝으로 종료합니다. 필요가 이제까지 열 이름 또는 인덱스를 기억 없습니다. 그리고 수많은 다른 혜택이 있습니다 ... 연결하는 유혹이 제거됩니다. 또한 연결을 잘못 취급의 가능성. 모든 쿼리하고 액세스하는 코드는 지속적으로 통합 테스트 dev에 DB에 있습니다. 당신의 DB에서 스키마 변경 사항은 응용 프로그램의 컴파일 오류로 팝업. 오히려 반지에 전화를 기다리는 것보다, 기존 생산 데이터베이스에 대해 응용 프로그램의 새 버전을 테스트 할 수 있도록 우리는 심지어, 래퍼의 자체 테스트 방법을 생성합니다. 누군가는 여전히 설득력이 필요하십니까?

    면책 조항 : 나는 QueryFirst을 쓴 :-)

  8. from https://stackoverflow.com/questions/915329/is-it-possible-to-run-native-sql-with-entity-framework by cc-by-sa and MIT license