সত্তা ফ্রেমওয়ার্ক 6 (কোড-ফার্স্ট) এ সঞ্চিত পদ্ধতিটি কীভাবে কল করবেন?


259

আমি সত্ত্বা ফ্রেমওয়ার্ক 6 এ খুব নতুন এবং আমি আমার প্রকল্পে সঞ্চিত পদ্ধতিগুলি প্রয়োগ করতে চাই। আমার নিম্নরূপে একটি সঞ্চিত পদ্ধতি রয়েছে:

ALTER PROCEDURE [dbo].[insert_department]
    @Name [varchar](100)
AS
BEGIN
    INSERT [dbo].[Departments]([Name])
    VALUES (@Name)

    DECLARE @DeptId int

    SELECT @DeptId = [DeptId]
    FROM [dbo].[Departments]
    WHERE @@ROWCOUNT > 0 AND [DeptId] = SCOPE_IDENTITY()

    SELECT t0.[DeptId]
    FROM [dbo].[Departments] AS t0
    WHERE @@ROWCOUNT > 0 AND t0.[DeptId] = @DeptId
END

Department শ্রেণী:

public class Department
{
    public int DepartmentId { get; set; }       
    public string Name { get; set; }
}

modelBuilder 
.Entity<Department>() 
.MapToStoredProcedures(s => 
s.Update(u => u.HasName("modify_department") 
               .Parameter(b => b.Department, "department_id") 
               .Parameter(b => b.Name, "department_name")) 
 .Delete(d => d.HasName("delete_department") 
               .Parameter(b => b.DepartmentId, "department_id")) 
 .Insert(i => i.HasName("insert_department") 
               .Parameter(b => b.Name, "department_name")));

protected void btnSave_Click(object sender, EventArgs e)
{
    string department = txtDepartment.text.trim();

    // here I want to call the stored procedure to insert values
}

আমার সমস্যাটি হ'ল: আমি কীভাবে সঞ্চিত পদ্ধতিটি কল করতে পারি এবং এর মধ্যে পরামিতিগুলি পাস করতে পারি?


আমি এটি জানতে আগ্রহী। আদর্শভাবে আমি পুরোপুরি EF এড়িয়ে যেতে এবং সঞ্চিত পদ্ধতি ছাড়া কিছুই না চালিয়ে দিতাম। আমি এসকিউএল-এর একজন বিশেষজ্ঞ কিন্তু EF প্রয়োগ করতে খুব হতাশাবোধ করেছি।
ডেভিড ব্রিটজ

উত্তর:


247

আপনি DbContextনিম্নলিখিত হিসাবে আপনার ক্লাসে একটি সঞ্চিত পদ্ধতি কল করতে পারেন ।

this.Database.SqlQuery<YourEntityType>("storedProcedureName",params);

তবে যদি আপনার সঞ্চিত পদ্ধতিটি আপনার নমুনা কোড হিসাবে একাধিক ফলাফল সেটগুলি দেয়, তবে আপনি এমএসডিএন এ এই সহায়ক নিবন্ধটি দেখতে পারেন

একাধিক ফলাফল সেট সহ সঞ্চিত পদ্ধতি


2
ধন্যবাদ_আলবার্জ আপনি দয়া করে সত্তা ফ্রেমওয়ার্ক 6 কোড ফার্স্টে সঞ্চিত প্রক্রিয়াটির বিভিন্ন প্রয়োগের জন্য আমাকে কিছু লিঙ্ক সরবরাহ করতে পারেন? আমি ওয়েবে সর্বত্র অনুসন্ধান করেছি কিন্তু এমন কোনও নিবন্ধ পাইনি যেখানে আমি সরাসরি IN এবং OUT পরামিতিগুলির জন্য সঞ্চিত পদ্ধতিতে কল করতে পারি। আপনার মূল্যবান সময় জন্য ধন্যবাদ।
জান

2
এই নিবন্ধটি হয়তো সহায়ক blogs.msdn.com/b/diego/archive/2012/01/10/...
তেহরান

8
এটি পরামিতিগুলির সাথে কাজ করে না বলে মনে হচ্ছে। ক্যোয়ারির অংশ হিসাবে এটি পরিষ্কারভাবে পরামিতিগুলি তালিকাভুক্ত করার প্রয়োজন বলে মনে হচ্ছে।
চিহ্নিত করুন

6
হ্যাঁ আপনার ক্যোয়ারির অংশ হিসাবে প্যারামগুলি নির্দিষ্ট করতে হবে - "storedProcedureName @param1, @param2"। এছাড়াও ধরণ paramsহয় System.Data.SqlClient.SqlParameter[]
ওপ্পা জিঙ্গহাম স্টাইল

6
this.Database.SqlQuery<YourEntityType>("storedProcedureName @param1", new System.Data.SqlClient.SqlParameter("@param1", YourParam));
পিপিপি

152

আপনাকে যা করতে হবে তা হ'ল একটি অবজেক্ট তৈরি করা উচিত যা সঞ্চিত প্রক্রিয়া দ্বারা প্রাপ্ত ফলাফলগুলির মতো একই সম্পত্তির নাম রয়েছে। নিম্নলিখিত সঞ্চিত পদ্ধতির জন্য:

    CREATE PROCEDURE [dbo].[GetResultsForCampaign]  
    @ClientId int   
    AS
    BEGIN
    SET NOCOUNT ON;

    SELECT AgeGroup, Gender, Payout
    FROM IntegrationResult
    WHERE ClientId = @ClientId
    END

দেখতে এমন একটি শ্রেণি তৈরি করুন:

    public class ResultForCampaign
    {
        public string AgeGroup { get; set; }

        public string Gender { get; set; }

        public decimal Payout { get; set; }
    }

এবং তারপরে নিম্নলিখিতটি করে প্রক্রিয়াটি কল করুন:

    using(var context = new DatabaseContext())
    {
            var clientIdParameter = new SqlParameter("@ClientId", 4);

            var result = context.Database
                .SqlQuery<ResultForCampaign>("GetResultsForCampaign @ClientId", clientIdParameter)
                .ToList();
    }

ResultForCampaignফলাফলটিতে অবজেক্টের একটি তালিকা থাকবে । আপনি SqlQueryপ্রয়োজন হিসাবে অনেক পরামিতি ব্যবহার করে কল করতে পারেন ।


2
একদম বন্ধ পরিস্থিতিতে, এটি দুর্দান্ত কাজ করবে। আমি দেখতে পেয়েছি যে পণ্যটির "গম ক্ষেত্র" বাদে ডিবিসিএনটেক্সট থেকে উত্তরাধিকারসূত্রে প্রাপ্ত শ্রেণীর সাথে এসপোক সংজ্ঞাটি দৃ tight়ভাবে মিলিত হওয়া উচিত।
গোল্ডবিশপ

50

আমি এটি দিয়ে সমাধান ExecuteSqlCommand

আমার মতো আপনার নিজস্ব পদ্ধতিটি ডিবিকন্টেক্সটে রাখুন:

public void addmessage(<yourEntity> _msg)
{
    var date = new SqlParameter("@date", _msg.MDate);
    var subject = new SqlParameter("@subject", _msg.MSubject);
    var body = new SqlParameter("@body", _msg.MBody);
    var fid = new SqlParameter("@fid", _msg.FID);
    this.Database.ExecuteSqlCommand("exec messageinsert @Date , @Subject , @Body , @Fid", date,subject,body,fid);
}

সুতরাং আপনার কোড-পিছনে এই জাতীয় পদ্ধতি থাকতে পারে:

[WebMethod] //this method is static and i use web method because i call this method from client side
public static void AddMessage(string Date, string Subject, string Body, string Follower, string Department)
{
    try
    {
        using (DBContext reposit = new DBContext())
        {
            msge <yourEntity> Newmsg = new msge();
            Newmsg.MDate = Date;
            Newmsg.MSubject = Subject.Trim();
            Newmsg.MBody = Body.Trim();
            Newmsg.FID= 5;
            reposit.addmessage(Newmsg);
        }
    }
    catch (Exception)
    {
        throw;
    }
}

এটি আমার এসপি:

Create PROCEDURE dbo.MessageInsert

    @Date nchar["size"],
    @Subject nchar["size"],
    @Body nchar["size"],
    @Fid int
AS
    insert into Msg (MDate,MSubject,MBody,FID) values (@Date,@Subject,@Body,@Fid)
    RETURN

আশা আপনাকে সাহায্য করেছে


2
আপনার সঞ্চিত পদ্ধতিতে আপনাকে এনসিআর প্যারামিটারগুলির একটি দৈর্ঘ্য নির্দিষ্ট করতে হবে - অন্যথায় আপনি এটি সন্ধানের মতো লম্বা মাত্র একটি অক্ষর।
ডেভ ডাব্লু

@ মাহদীঘাফুরিয়ান এটি একটি খুব দরকারী উত্তর, ধন্যবাদ অনেক ধন্যবাদ! :)
কমেগেম

এই সিনট্যাক্সটির জন্য এসপ্রোকের পরামিতিগুলির ক্রমানুসারে কোনও পরিবর্তন দরকার নেই, অন্য কথায় অর্ডিনাল পজিশনিং।
গোল্ডবিশপ

21

আপনার উদাহরণ ব্যবহার করে, এখানে এটি সম্পাদন করার দুটি উপায় রয়েছে:

1 - সজ্জিত পদ্ধতি ম্যাপিং ব্যবহার করুন

নোট করুন যে এই কোডটি ম্যাপিংয়ের সাথে বা ছাড়াই কাজ করবে। আপনি যদি সত্তায় ম্যাপিং বন্ধ করেন, EF একটি সন্নিবেশ + নির্বাচন বিবরণ উত্পন্ন করবে।

protected void btnSave_Click(object sender, EventArgs e)
{
     using (var db = DepartmentContext() )
     {
        var department = new Department();

        department.Name = txtDepartment.text.trim();

        db.Departments.add(department);
        db.SaveChanges();

        // EF will populate department.DepartmentId
        int departmentID = department.DepartmentId;
     }
}

2 - সঞ্চিত পদ্ধতিটি সরাসরি কল করুন

protected void btnSave_Click(object sender, EventArgs e)
{
     using (var db = DepartmentContext() )
     {
        var name = new SqlParameter("@name", txtDepartment.text.trim());

        //to get this to work, you will need to change your select inside dbo.insert_department to include name in the resultset
        var department = db.Database.SqlQuery<Department>("dbo.insert_department @name", name).SingleOrDefault();

       //alternately, you can invoke SqlQuery on the DbSet itself:
       //var department = db.Departments.SqlQuery("dbo.insert_department @name", name).SingleOrDefault();

        int departmentID = department.DepartmentId;
     }
}

আমি প্রথম পন্থাটি ব্যবহার করার পরামর্শ দিচ্ছি, কারণ আপনি সরাসরি বিভাগের সাথে কাজ করতে পারেন এবং স্কেলপ্যারামিটার অবজেক্টগুলির একটি গুচ্ছ তৈরি করতে হবে না।


3
সাবধানতা অবলম্বন করুন, দ্বিতীয় উদাহরণটি কী এই পরিবর্তনটি ডিবি কনটেক্সট দ্বারা ট্র্যাক করা হয় না
সম্পাদিকা

EDIT.Ust.Sata.Data.Entity.DbSet <TEntity> .SllQuery (স্ট্রিং, অবজেক্ট []) এর পরিবর্তে ব্যবহার করুন।
সম্পাদকীয়

@edtruant dbContext পরিবর্তনটি ট্র্যাক করতে প্রদর্শিত হবে। পরীক্ষা করতে, আমি db। <DbSet> .োকানো স্টেটমেন্টের আগে এবং পরে অ্যাকাউন্ট () হিসাব করেছিলাম। উভয় পদ্ধতিতে, গণনা এক এক করে বৃদ্ধি পেয়েছে। সম্পূর্ণতার জন্য আমি উদাহরণটিতে বিকল্প পদ্ধতি যুক্ত করেছি।
ব্রায়ান ভ্যান্ডার প্ল্যাটস

1
আমি প্রথম উদাহরণে সঞ্চিত পদ্ধতির কোনও রেফারেন্স দেখতে পাচ্ছি না।
xr280xr

2
@ xr280xr সন্নিবেশ_বিস্তারে ওপির প্রশ্নের মডেল বিল্ডার অভিব্যক্তিতে উল্লেখ করা হয়েছে। জিনিসগুলিকে এইভাবে ম্যাপিংয়ের সুবিধা এটি কারণ এটি কার্যকরভাবে একইভাবে কাজ করে যেমন আপনি EF- কে সন্নিবেশ / আপডেট / বিবৃতি মুছে ফেলতে দিচ্ছেন
ব্রায়ান ভ্যান্ডার প্ল্যাটস

15

আপনি ব্যবহার করছেন MapToStoredProcedures()যা নির্দেশ করে যে আপনি সঞ্চিত পদ্ধতিতে আপনার সত্তাগুলি ম্যাপ করছেন, এটি করার সময় আপনাকে কোনও সঞ্চিত পদ্ধতি রয়েছে এবং contextএটিকে স্বাভাবিক হিসাবে ব্যবহার করা উচিত the এরকম কিছু ( ব্রাউজারে লেখা তাই পরীক্ষিত নয় )

using(MyContext context = new MyContext())
{
    Department department = new Department()
    {
        Name = txtDepartment.text.trim()
    };
    context.Set<Department>().Add(department);
}

আপনি যা করতে চেষ্টা করছেন তা যদি সরাসরি কোনও স্টোরেজ পদ্ধতিতে কল করা হয় তবে ব্যবহার করুন SqlQuery


2
ধন্যবাদ qujck তবে আমি সঞ্চিত পদ্ধতি ব্যবহার করতে চাই। সুবিধার্থে বোঝার জন্য আমি একটি নমুনা কোড দিয়েছি।
জান

4
@ জাআন - উপরের কোডটি সঞ্চিত পদ্ধতি ব্যবহার করবে । আপনি কি বলতে চান যে আপনি সরাসরি সঞ্চিত পদ্ধতিতে কল করতে চান?
qujck

হ্যাঁ. আপনি কি দয়া করে আমাকে বলতে পারেন কোন উপায়টি সবচেয়ে ভাল। সরাসরি প্রদত্ত পদ্ধতি বা উপরের কোডটি কল করছেন?
জান 15

6
@ জাআন আমার দেখানো কোডটি ব্যবহার করুন - ওআরএম বোঝানো হচ্ছে অন্তর্নিহিত বাস্তবায়নটি আড়াল করা - উপরের কোডটি ব্যবহার করে নিশ্চিত করে যে কোনও সংরক্ষিত পদ্ধতি আছে কিনা তা আপনার বাকী কোডের সাথে কোনও ব্যাপার না। এমনকি আপনি অন্য কোনও সঞ্চিত পদ্ধতিতে মডেল ম্যাপিংকে পরিবর্তন করতে পারেন বা অন্য কিছু পরিবর্তন না করে কোনও সঞ্চিত প্রক্রিয়া নাও করতে পারেন।
qujck

4
@ চাজ্ট 3 এন প্রশ্নটি সঞ্চিত পদ্ধতিগুলি লাইন থেকে কনফিগার করা হচ্ছে তা দেখায় .MapToStoredProcedures(s => । একটি কলটি Addসমাধান করা উচিত.Insert(i => i.HasName("insert_department")
কোজক করুন

12

আপনি এখন আমার তৈরি একটি কনভেনশনও ব্যবহার করতে পারেন যা সঞ্চিত সঞ্চিত পদ্ধতিগুলি (একাধিক রেজাল্টগুলি ফিরিয়ে আনতে সঞ্চিত পদ্ধতি সহ), টিভিএফ এবং স্কেলার ইউডিএফগুলিকে স্থানীয়ভাবে এএফ থেকে সক্ষম করে।

সত্তা ফ্রেমওয়ার্ক 6.1 প্রকাশ না হওয়া অবধি স্টোর ফাংশনগুলি (যেমন টেবিলের মূল্যবান ক্রিয়াকলাপ এবং সঞ্চিত পদ্ধতি) কেবলমাত্র ডাটাবেস ফার্স্ট করার সময় ইএফ-তে ব্যবহৃত হতে পারে। কিছু কাজের ক্ষেত্র ছিল যা কোড ফার্স্ট অ্যাপ্লিকেশনগুলিতে স্টোর ফাংশনগুলি আহ্বান করা সম্ভব করেছিল কিন্তু আপনি এখনও লিনক ক্যোয়ারিতে টিভিএফ ব্যবহার করতে পারেননি যা অন্যতম সীমাবদ্ধতা ছিল। EF 6.1 এ ম্যাপিং এপিআই সর্বজনীন করা হয়েছিল যা (কিছু অতিরিক্ত টুইটের সাথে) আপনার কোড ফার্স্ট অ্যাপ্লিকেশনগুলিতে স্টোর ফাংশনগুলি ব্যবহার করা সম্ভব করে তুলেছিল।

আরও পড়ুন

আমি গত দু'সপ্তাহ ধরে বেশ শক্তভাবে ধাক্কা দিয়েছি এবং এটি এখানে - কোড ফার্স্ট অ্যাপ্রোচ এবং সত্তা ফ্রেমওয়ার্ক .1.১.১ ব্যবহার করে এমন অ্যাপ্লিকেশনগুলিতে স্টোর ফাংশনগুলি (যেমন সঞ্চিত পদ্ধতি, টেবিলের মূল্যবান ফাংশন ইত্যাদি) সক্ষম করে the বা আরও নতুন)। আমি এই রিলিজটিতে অন্তর্ভুক্ত হওয়া ফিক্স এবং নতুন বৈশিষ্ট্যগুলি নিয়ে বেশি খুশি।

আরও পড়ুন


প্রকৃতপক্ষে ৪.০ থেকে, আপনি মডেল ছাড়াই এসপ্রোকস কার্যকর করতে পারেন। আপনাকে বস্তুর সম্পত্তির পরিবর্তে কাঁচা এসকিউএল বিবৃতি কার্যকর করতে হবে। এমনকি .1.১.x সহ, আপনাকে একই জাতীয় প্রভাব অর্জন করতে SqlQuery <T> বা এক্সিকিউট এসকিএলকম্যান্ড ব্যবহার করতে হবে।
গোল্ডবিশপ

10
object[] xparams = {
            new SqlParameter("@ParametterWithNummvalue", DBNull.Value),
            new SqlParameter("@In_Parameter", "Value"),
            new SqlParameter("@Out_Parameter", SqlDbType.Int) {Direction = ParameterDirection.Output}};

        YourDbContext.Database.ExecuteSqlCommand("exec StoreProcedure_Name @ParametterWithNummvalue, @In_Parameter, @Out_Parameter", xparams);
        var ReturnValue = ((SqlParameter)params[2]).Value;  

1
প্যারামগুলি শনাক্তকারী একটি আলাদা নাম ব্যবহার করে।
যোগিহোস্টিং

2
এখানে SaveChanges () প্রয়োজনীয় নয়। পরিবর্তনগুলি এক্সিকিউটসক্লককম্যান্ড () কল এ প্রতিশ্রুতিবদ্ধ হয়।
জাভিয়ের পইনাস

10

এটি প্যারামিটারে যাওয়ার সময় একটি সঞ্চিত প্রক্রিয়া থেকে ডেটা ফিরিয়ে নিয়ে কাজ করে।

var param = new SqlParameter("@datetime", combinedTime);
var result = 
        _db.Database.SqlQuery<QAList>("dbo.GetQAListByDateTime @datetime", param).ToList();

_db এটি ডিবি কনটেক্সট


9

এই লিঙ্কটিতে একবার নজর দিন যা দেখায় যে কীভাবে সন্নিবেশ, আপডেট এবং মুছে ফেলার জন্য সঞ্চিত পদ্ধতি সহ EF 6 এর ম্যাপিং কাজ করে: http://msdn.microsoft.com/en-us/data/dn468673

যোগ

কোড প্রথম থেকে একটি সঞ্চিত পদ্ধতি কল করার জন্য এখানে একটি দুর্দান্ত উদাহরণ:

বলুন আপনাকে একটি একক প্যারামিটার দিয়ে একটি সঞ্চিত পদ্ধতি প্রয়োগ করতে হবে এবং সঞ্চিত পদ্ধতিটি সত্তা রাজ্যের সাথে মেলে এমন একটি ডেটার সেট দেয় যা আমাদের কাছে রয়েছে:

var countryIso = "AR"; //Argentina

var statesFromArgentina = context.Countries.SqlQuery(
                                      "dbo.GetStatesFromCountry @p0", countryIso
                                                    );

এখন বলা যাক যে আমরা দুটি প্যারামিটার সহ আরেকটি সঞ্চিত পদ্ধতি কার্যকর করতে চাই:

var countryIso = "AR"; //Argentina
var stateIso = "RN"; //Río Negro

var citiesFromRioNegro = context.States.SqlQuery(
                            "dbo.GetCitiesFromState @p0, @p1", countryIso, stateIso
                          );

লক্ষ্য করুন যে আমরা পরামিতিগুলির জন্য সূচক-ভিত্তিক নামকরণ ব্যবহার করছি। এটি কারণ যে কোনও এসকিউএল ইনজেকশন সমস্যা এড়াতে DbParameter অবজেক্টগুলি আপনাকে এড়িয়ে যাওয়ার কারণে সত্তা ফ্রেমওয়ার্ক এই প্যারামিটারগুলি আপ করবে।

আশা করি এই উদাহরণটি সাহায্য করবে!


6
public IList<Models.StandardRecipeDetail> GetRequisitionDetailBySearchCriteria(Guid subGroupItemId, Guid groupItemId)
{
    var query = this.UnitOfWork.Context.Database.SqlQuery<Models.StandardRecipeDetail>("SP_GetRequisitionDetailBySearchCriteria @SubGroupItemId,@GroupItemId",
    new System.Data.SqlClient.SqlParameter("@SubGroupItemId", subGroupItemId),
    new System.Data.SqlClient.SqlParameter("@GroupItemId", groupItemId));
    return query.ToList();
}

4

এটি কোডে আমার জন্য প্রথমে কাজ করে। এটি ভিউ মডেলের মিলিয়ে সম্পত্তি (স্টুডেন্টচ্যাপ্টার কমপ্ল্যাশনভিউমোডেল) সহ একটি তালিকা ফেরত দেয়

var studentIdParameter = new SqlParameter
{
     ParameterName = "studentId",
     Direction = ParameterDirection.Input,
     SqlDbType = SqlDbType.BigInt,
     Value = studentId
 };

 var results = Context.Database.SqlQuery<StudentChapterCompletionViewModel>(
                "exec dbo.sp_StudentComplettion @studentId",
                 studentIdParameter
                ).ToList();

প্রসঙ্গের জন্য আপডেট হয়েছে

প্রসঙ্গটি ক্লাসের উদাহরণ যা নীচে ইনহেরিট ডিবি কনটেক্সট পছন্দ করে।

public class ApplicationDbContext : DbContext
{
    public DbSet<City> City { get; set; }
}

var Context = new  ApplicationDbContext();

হাই, আমি এই কনটেক্সট.ড্যাটাবেস.স্কুলকিউ <মডেল> খুঁজে পাচ্ছি না, যেখানে আমি এই Context.TableName.SqlQuery (ProcName) করতে পারি। যা আমাকে ইস্যু দিচ্ছে
মার্শাল

@ মার্শাল, সম্ভবত আপনি প্রথম ডিজাইনটি ডাটাবেস ব্যবহার করছেন। এই লিঙ্কে চেক করুন stackoverflow.com/questions/11792018/...
reza.cse08

1

মাইন্ডলেস যাত্রীর একটি প্রকল্প রয়েছে যা সত্তা ফ্রেমওয়ার্ক ব্যবহার করে একাধিক ফলাফল সেটগুলি সঞ্চিত প্রকট থেকে ফিরে আসতে দেয় allows নীচে তার একটি উদাহরণ ....

using (testentities te = new testentities())
{
    //-------------------------------------------------------------
    // Simple stored proc
    //-------------------------------------------------------------
    var parms1 = new testone() { inparm = "abcd" };
    var results1 = te.CallStoredProc<testone>(te.testoneproc, parms1);
    var r1 = results1.ToList<TestOneResultSet>();
}

1

আপনি প্যারামিটারগুলি পাস করতে পারেন sp_GetByIdএবং ফলাফলগুলি আনতে পারেন ToList()বা হয়FirstOrDefault();

var param  = new SqlParameter("@id", 106);
var result = dbContext
               .Database
               .SqlQuery<Category>("dbo.sp_GetById @id", param)
               .FirstOrDefault();

0

আপনি যদি সঞ্চিত পদ্ধতিতে টেবিলের প্যারামগুলি পাস করতে চান তবে আপনার টেবিলের প্যারামগুলির জন্য আপনার অবশ্যই টাইপনাম সম্পত্তি সেট করতে হবে।

SqlParameter codesParam = new SqlParameter(CODES_PARAM, SqlDbType.Structured);
            SqlParameter factoriesParam = new SqlParameter(FACTORIES_PARAM, SqlDbType.Structured);

            codesParam.Value = tbCodes;
            codesParam.TypeName = "[dbo].[MES_CodesType]";
            factoriesParam.Value = tbfactories;
            factoriesParam.TypeName = "[dbo].[MES_FactoriesType]";


            var list = _context.Database.SqlQuery<MESGoodsRemain>($"{SP_NAME} {CODES_PARAM}, {FACTORIES_PARAM}"
                , new SqlParameter[] {
                   codesParam,
                   factoriesParam
                }
                ).ToList();

0

এটিই ডিবি কনটেক্সট ক্লাসে ইএফ (ডিবি প্রথম) উত্পন্ন করে:

public ObjectResult<int> Insert_Department(string department)
{
    var departmentParameter = new ObjectParameter("department", department);

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<int>("insert_department", departmentParameter);
}

0

যখন EDMX এই সময়টি তৈরি করে আপনি যদি সারণি নির্বাচন বিকল্পে সঞ্চিত পদ্ধতি নির্বাচন করেন তবে কেবল প্রক্রিয়াধীন নাম ব্যবহার করে কল স্টোর প্রক্রিয়াজাত করুন ...

var num1 = 1; 
var num2 = 2; 

var result = context.proc_name(num1,num2).tolist();// list or single you get here.. using same thing you can call insert,update or delete procedured.

0

আমি খুঁজে পেয়েছি যে কোড প্রথম পদ্ধতির মধ্যে সঞ্চিত পদ্ধতি কল করা সুবিধাজনক নয়। আমি Dapperপরিবর্তে ব্যবহার করতে পছন্দ করি

নিম্নলিখিত কোডটি দিয়ে লেখা ছিল Entity Framework:

var clientIdParameter = new SqlParameter("@ClientId", 4);

var result = context.Database
.SqlQuery<ResultForCampaign>("GetResultsForCampaign @ClientId", clientIdParameter)
.ToList();

নিম্নলিখিত কোডটি দিয়ে লেখা ছিল Dapper:

return Database.Connection.Query<ResultForCampaign>(
            "GetResultsForCampaign ",
            new
            {
                ClientId = 4
            },
            commandType: CommandType.StoredProcedure);

আমি বিশ্বাস করি কোডের দ্বিতীয় অংশটি বোঝা সহজ।


0
public static string ToSqlParamsString(this IDictionary<string, string> dict)
        {
            string result = string.Empty;
            foreach (var kvp in dict)
            {
                result += $"@{kvp.Key}='{kvp.Value}',";
            }
            return result.Trim(',', ' ');
        }

public static List<T> RunSproc<T>(string sprocName, IDictionary<string, string> parameters)
        {
            string command = $"exec {sprocName} {parameters.ToSqlParamsString()}";
            return Context.Database.SqlQuery<T>(command).ToList();
        }

0

কিছুই করার নেই ... আপনি যখন কোডের জন্য ডিবকনেক্সট্ট তৈরি করছেন তখন প্রথমে সাবলীল এপিআই অঞ্চলের নীচে নেমস্পেসের সূচনা করে এসপিটির তালিকা তৈরি করুন এবং যেখানে আপনি চান সেখানে এটি ব্যবহার করুন।

public partial class JobScheduleSmsEntities : DbContext
{
    public JobScheduleSmsEntities()
        : base("name=JobScheduleSmsEntities")
    {
        Database.SetInitializer<JobScheduleSmsEntities>(new CreateDatabaseIfNotExists<JobScheduleSmsEntities>());
    }

    public virtual DbSet<Customer> Customers { get; set; }
    public virtual DbSet<ReachargeDetail> ReachargeDetails { get; set; }
    public virtual DbSet<RoleMaster> RoleMasters { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //modelBuilder.Types().Configure(t => t.MapToStoredProcedures());

        //modelBuilder.Entity<RoleMaster>()
        //     .HasMany(e => e.Customers)
        //     .WithRequired(e => e.RoleMaster)
        //     .HasForeignKey(e => e.RoleID)
        //     .WillCascadeOnDelete(false);
    }
    public virtual List<Sp_CustomerDetails02> Sp_CustomerDetails()
    {
        //return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Sp_CustomerDetails02>("Sp_CustomerDetails");
        //  this.Database.SqlQuery<Sp_CustomerDetails02>("Sp_CustomerDetails");
        using (JobScheduleSmsEntities db = new JobScheduleSmsEntities())
        {
           return db.Database.SqlQuery<Sp_CustomerDetails02>("Sp_CustomerDetails").ToList();

        }

    }

}

}

public partial class Sp_CustomerDetails02
{
    public long? ID { get; set; }
    public string Name { get; set; }
    public string CustomerID { get; set; }
    public long? CustID { get; set; }
    public long? Customer_ID { get; set; }
    public decimal? Amount { get; set; }
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }
    public int? CountDay { get; set; }
    public int? EndDateCountDay { get; set; }
    public DateTime? RenewDate { get; set; }
    public bool? IsSMS { get; set; }
    public bool? IsActive { get; set; }
    public string Contact { get; set; }
}

0

মাইএসকিউএল এবং সত্তা ফ্রেমওয়ার্ক কোডটি প্রথম পদ্ধতির ব্যবহার:

public class Vw_EMIcount
{
    public int EmiCount { get; set; }
    public string Satus { get; set; }
}

var result = context.Database.SqlQuery<Vw_EMIcount>("call EMIStatus('2018-3-01' ,'2019-05-30')").ToList();

0

এমওয়াইএসকিএলে পদ্ধতি তৈরি করুন।

delimiter //
create procedure SP_Dasboarddata(fromdate date, todate date)
begin
select count(Id) as count,date,status,sum(amount) as amount from 
details
where (Emidate between fromdate and todate)
group by date ,status;
END;
//

ক্লাস তৈরি করুন যা সঞ্চিত পদ্ধতিতে ফলাফল ফলাফল সেট মান রাখে

[Table("SP_reslutclass")]
public  class SP_reslutclass
{
    [Key]
    public int emicount { get; set; }
    public DateTime Emidate { get; set; }
    public int ? Emistatus { get; set; }
    public int emiamount { get; set; }

}

Dbcontext এ ক্লাস যুক্ত করুন

  public  class ABCDbContext:DbContext
{
    public ABCDbContext(DbContextOptions<ABCDbContext> options)
       : base(options)
    {

    }

 public DbSet<SP_reslutclass> SP_reslutclass { get; set; }
}

ভান্ডারে কল সত্তা

   var counts = _Dbcontext.SP_reslutclass.FromSql("call SP_Dasboarddata 
                    ('2019-12-03','2019-12-31')").ToList();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.