2016-11-03 5 views
0

エンティティフレームワーク6.0.0.0を使用しています.3カラムを返すSQL関数を持っています 2 guidと1つのvarchar(userid、ticketid 、数)。 ADO.netコンポーネントを使用せずにこのカスタムSQL関数を呼び出す方法 エンティティフレームワークを使用しています(コードの最初のアプローチ)。エンティティフレームワークを使用してSqlユーザ定義関数を呼び出す方法LInqを使用して最初にアプローチするコード#

+1

を私が間違えていないよ場合のいずれかで、/20131632/call-a-sql-user-defined-function-in-a-linq-query) –

+1

これはもっと近いかもしれません:[Entity Framework 6 Code First Custom Functions](http://stackoverflow.com/q/29517627/6400526) –

+0

答えてくれてありがとうございます。しかし、私は現在、そのユーザー定義のSQL関数を呼び出すSPを作成し、C#コードを使用してそのSPを呼び出すことで私の問題を解決します。しかし、私が知りたいのは、エンティティフレームワーク(バージョン6.0.0.0)を使用してデータベースに存在するユーザ定義関数C#コード... – user3811011

答えて

0

私は同じものを持っていました:DbContextから派生したクラスで、いくつかのDbSetプロパティと1つのストアドプロシージャがあります。ストアドプロシージャは、(移行の場合に必要)ストアドプロシージャを作成または変更

  • が存在する場合は、ストアドプロシージャを呼び出す
    • チェック:私は3つの機能を追加しました。

    あなたの質問は最後の部分です。また、三つの機能

    public class InvoiceContext : DbContext 
    { 
        // DbSet properties left out 
    
        #region stored procedures 
        private const string StoredProcedureNameProcessUsageCosts = "processusagecosts"; 
    
        public void CallStoredProcedureProcessUsageCosts(UsageCosts usageCosts) 
        { 
         object[] functionParameters = new object[] 
         { 
          new SqlParameter(@"ReportDate", usageCosts.ReportPeriod), 
          new SqlParameter(@"CustomerContractId", usageCosts.CustomerContractId), 
          new SqlParameter(@"CallType", usageCosts.CallType), 
          new SqlParameter(@"TariffGroup", usageCosts.TariffGroup), 
          new SqlParameter(@"VatValue", usageCosts.VatValue), 
          new SqlParameter(@"PurchaseCosts", usageCosts.PurchaseCosts), 
          new SqlParameter(@"RetailCosts", usageCosts.RetailCosts), 
         }; 
    
         const string sqlCommand = @"Exec " + StoredProcedureNameProcessUsageCosts 
          + " @ReportDate, @CustomerContractId, @CallType, @TariffGroup, @VatValue," 
          + " @PurchaseCosts, @RetailCosts"; 
         this.Database.ExecuteSqlCommand(sqlCommand, functionParameters); 
        } 
    
        public bool StoredProcedureProcessUsageCostsExists() 
        { 
         return this.Exists(StoredProcedureNameProcessUsageCosts); 
        } 
    
        public void CreateProcedureProcessUsageCosts(bool forceRecreate) 
        { 
         bool storedProcedureExists = this.Exists (StoredProcedureNameUpdateUsageCosts); 
    
         // only create (or update) if not exists or if forceRecreate: 
         if (!storedProcedureExists || forceRecreate) 
         { // create or alter: 
          var x = new StringBuilder(); 
    
          // ALTER or CREATE? 
          if (!storedProcedureExists) 
          { 
           x.Append(@"CREATE"); 
          } 
          else 
          { 
           x.Append(@"ALTER"); 
          } 
    
          // procedure name: 
          x.Append(@" procedure "); 
          x.AppendLine(StoredProcedureNameProcessUsageCosts); 
    
          // parameters: 
          x.AppendLine(@"@ReportPeriod int,"); 
          x.AppendLine(@"@CustomerContractId bigint,"); 
          x.AppendLine(@"@CallType nvarChar(80),"); 
          x.AppendLine(@"@TariffGroup nvarChar(80),"); 
          x.AppendLine(@"@VatValue decimal(18, 2),"); 
          x.AppendLine(@"@PurchaseCosts decimal(18, 2),"); 
          x.AppendLine(@"@RetailCosts decimal(18, 2)"); 
    
          // code 
          x.AppendLine(@"as"); 
          x.AppendLine(@"begin"); 
          x.AppendLine(@"Merge [usagecosts]"); 
          x.AppendLine(@"Using (Select @ReportPeriod as reportperiod,"); 
          x.AppendLine(@"    @CustomerContractId as customercontractId,"); 
          x.AppendLine(@"    @CallType as calltype,"); 
          x.AppendLine(@"    @TariffGroup as tariffgroup,"); 
          x.AppendLine(@"    @VatValue as vatvalue)"); 
          x.AppendLine(@"    As tmp "); 
          x.AppendLine(@"On ([usagecosts].[reportperiod] = tmp.reportperiod"); 
          x.AppendLine(@"AND [usagecosts].[customercontractId] = tmp.customercontractid"); 
          x.AppendLine(@"AND [usagecosts].[calltype] = tmp.calltype"); 
          x.AppendLine(@"AND [usagecosts].[tariffgroup] = tmp.tariffgroup"); 
          x.AppendLine(@"AND [usagecosts].[vatvalue] = tmp.Vatvalue)"); 
          x.AppendLine(@"When Matched Then "); 
          x.AppendLine(@" Update Set [usagecosts].[purchasecosts] = [usagecosts].[purchasecosts] + @purchasecosts,"); 
          x.AppendLine(@"    [usagecosts].[retailcosts] = [usagecosts].[retailcosts] + @retailcosts"); 
          x.AppendLine(@"When Not Matched Then"); 
          x.AppendLine(@" Insert (ReportPeriod, CustomerContractId, calltype, tariffgroup, vatvalue, purchasecosts, retailcosts)"); 
          x.AppendLine(@" Values (@reportPeriod, @CustomerContractId, @CallType, @TariffGroup, @VatValue, @PurchaseCosts, @RetailCosts);"); 
          x.AppendLine(@"end"); 
          this.Database.ExecuteSqlCommand(x.ToString()); 
         } 
         // else: procedure exists and no forced recreate, nothing to do 
        } 
        #endregion stored procedures 
    } 
    

    使用されているので、ここでは、他のものをお勧めします:

    using (var dbContext - new InvoiceContext(...)) { UsageCosts params = new UsageCosts() { ... }; dbContext.CallStoredProcedureUsageCost(params); } 

    ストアドプロシージャを呼び出すストアドプロシージャ

    を作成します。最初の播種中にInitializeDataBaseでこれを行う[LINQクエリでSQLユーザー定義関数を呼び出す]の可能複製(http://stackoverflow.com/questions - データベースF、またはマイグレーション機能

    public override void InitializeDatabase(InvoiceContext context) 
    { 
        // if not exists, create the stored procedure 
        context.CreateProcedureProcessUsageCosts(false); 
    } 
    
  • +0

    答えをありがとう。私の問題は、そのユーザー定義のSQL関数を呼び出すSPを作成し、C#のコードを使用してそのSPを呼び出すことによって..しかし、私が知りたいのは、エンティティフレームワーク(バージョンを使用してdatatbaseに存在するUserdefined関数6.0.0.0)c#code ... – user3811011

    +0

    EntityFrameworkを使用してデータベースに常駐するユーザー定義関数を呼び出すエレガントな方法があります。上で示したように、これはDbContext.Databaseを介してアクセス可能なSystem.Data.Entity.Database.ExecuteSqlCommand関数です –

    関連する問題