লিনক থেকে এসকিএল ব্যবহার করে একাধিক সারি কীভাবে আপডেট করবেন?


94

সারণী:

id     userid  friendid   name    status
1      1        2         venkat  false
2      1        3         sai     true
3      1        4         arun    false
4      1        5         arjun   false

যদি ব্যবহারকারী ইউজারিড = 1, ফ্রেন্ডিডস = 2,4,5 স্থিতি = সত্য প্রেরণ করে

উপরের সমস্ত বন্ধুত্বের স্থিতিটি কীভাবে আপডেট করবেন তার জন্য আমাকে জিজ্ঞাসাটি বলুন। [একবারে 2,3,4]।?

ধন্যবাদ

উত্তর:


238

একটি কলাম আপডেট করার জন্য এখানে কিছু বাক্য গঠন বিকল্প রয়েছে:

বিকল্প 1

var ls=new int[]{2,3,4};
using (var db=new SomeDatabaseContext())
{
    var some= db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList();
    some.ForEach(a=>a.status=true);
    db.SubmitChanges();
}

বিকল্প 2

using (var db=new SomeDatabaseContext())
{
     db.SomeTable
       .Where(x=>ls.Contains(x.friendid))
       .ToList()
       .ForEach(a=>a.status=true);

     db.SubmitChanges();
}

বিকল্প 3

using (var db=new SomeDatabaseContext())
{
    foreach (var some in db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList())
    {
        some.status=true;
    }
    db.SubmitChanges();
}

হালনাগাদ

মন্তব্যে অনুরোধ অনুসারে এটি একাধিক কলাম কীভাবে আপডেট করবেন তা দেখানো বুদ্ধিমান হতে পারে। সুতরাং আসুন এই অনুশীলনের উদ্দেশ্যটির জন্য বলতে পারি যে আমরা কেবল এগুলি আপডেট করতে চাই না status। আমরা আপডেট করতে চাই nameএবং statusকোথায় friendidমিলছে। এখানে এর জন্য কিছু বাক্য গঠন বিকল্প রয়েছে:

বিকল্প 1

var ls=new int[]{2,3,4};
var name="Foo";
using (var db=new SomeDatabaseContext())
{
    var some= db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList();
    some.ForEach(a=>
                    {
                        a.status=true;
                        a.name=name;
                    }
                );
    db.SubmitChanges();
}

বিকল্প 2

using (var db=new SomeDatabaseContext())
{
    db.SomeTable
        .Where(x=>ls.Contains(x.friendid))
        .ToList()
        .ForEach(a=>
                    {
                        a.status=true;
                        a.name=name;
                    }
                );
    db.SubmitChanges();
}

বিকল্প 3

using (var db=new SomeDatabaseContext())
{
    foreach (var some in db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList())
    {
        some.status=true;
        some.name=name;
    }
    db.SubmitChanges();
}

আপডেট 2

উত্তরে আমি লিনকিউ এসকিউএল-তে ব্যবহার করছিলাম এবং সেক্ষেত্রে ডাটাবেসটিতে প্রতিশ্রুতি দেওয়ার জন্য ব্যবহারটি হ'ল:

db.SubmitChanges();

কিন্তু সত্তা ফ্রেমওয়ার্কের জন্য পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করার জন্য এটি হ'ল:

db.SaveChanges()

6
এবং একাধিক মন্তব্যের জন্য আপনাকে এটি করতে হবে:records.ForEach(x=> { x.Deleted = true; x.DeletedByUserID = deletedByUserId; x.DeletedOn = DateTime.Now; });
জোনএইচ

4
এটা কি হওয়া উচিত db.SaveChanges()নয় db.SubmitChanges()?
bradlis7

4
... আপনার তিনটি অপশন একই। প্রকৃতপক্ষে প্রথম দুটিয়ের মধ্যে পার্থক্যটি হ'ল একটি একটি ভেরিয়েবল ব্যবহার করে এবং একটিও তা করে না। উভয় থাকার সবেমাত্র শব্দ বেড়ে যায়।
ব্লুরাজা - ড্যানি পিফ্লুঘুফ্ট

4
এটা ছাড়া কি সম্ভব ToList()? এটি হত্যাকারী
টুলকিট

4
শর্ত অনুসারে টোললিস্ট () ডাটাবেস থেকে সমস্ত রেকর্ড পেয়েছে, তাই না? যদি এটি সঠিক হয় তবে এটি সত্যই খারাপ পারফরম্যান্স হবে, যদি লক্ষ লক্ষ রেকর্ড থাকে তবে আমরা এই ফাংশনটি পরিচালনা করতে মেমরিটিতে এগুলি লোড করব? আমি ভুল হয়ে থাকলে আমাকে সংশোধন করুন।
জ্যাকব 11

20

ToList()গৃহীত উত্তরের মতো পদ্ধতিটি ব্যবহার করবেন না !

এসকিউএল প্রোফাইলার চলমান, আমি যাচাই করেছি এবং খুঁজে পেয়েছি যে ToList()ফাংশনটি ডেটাবেস থেকে সমস্ত রেকর্ড পায়। এটা সত্যিই খারাপ পারফরম্যান্স !!

আমি খাঁটি এসকিএল কমান্ড দ্বারা এই কোয়েরিটি নিম্নলিখিতভাবে চালিত করতাম:

string query = "Update YourTable Set ... Where ...";    
context.Database.ExecuteSqlCommandAsync(query, new SqlParameter("@ColumnY", value1), new SqlParameter("@ColumnZ", value2));

এটি এমনকি এক সারি নির্বাচন না করে ওয়ান শটে আপডেটটি পরিচালনা করবে।


3

এটি আমিই করেছি:

EF:

using (var context = new SomeDBContext())
{
    foreach (var item in model.ShopItems)  // ShopItems is a posted list with values 
    {    
        var feature = context.Shop
                             .Where(h => h.ShopID == 123 && h.Type == item.Type).ToList();

        feature.ForEach(a => a.SortOrder = item.SortOrder);
    }

    context.SaveChanges();
}

আশা কাউকে সাহায্য করে।


একটি যাদুমন্ত্র মত কাজ করে!
ইউ ইয়াং জিয়ান

4
এটি খারাপ, আপনি রেকর্ডটি আনার জন্য প্রতিটি সময় ডাটাবেসকে কল করছেন featureএবং এটির context.SaveChanges()ভিতরে আপনার যুক্ত করা উচিত নয় foreachফোরচ লুপের বাইরে হওয়া উচিত।
জওয়ানদ সিং

4
এসকিউএল EF কোডের মতো নয়। এসকিউএলে এটি কেবলমাত্র 1 টি কমান্ড যা সমস্ত সারিটিতে চলে এবং টেবিলটি আপডেট করে। ইএফ কোডটি প্রথমে সমস্ত সারি নেয়, পরিবর্তিতগুলি ডিবি-তে আপডেট করে, এর অর্থ আপনার যদি 1000 টি আপডেট হওয়া সারি থাকে তবে এটি 1000 বর্গ আপডেট আপডেট করবে
আশকান সিরিস

4
@ স্টম এটি এখনও একই নয় :) প্রসঙ্গ.সভেচেনজেসস (); শুধু আপনার আপডেট জমা দেয়। এখনও আইডিটি ব্যবহার করে প্রতিটি আপডেট আপডেট কমান্ড থাকবে এবং সোর্টারর্ডার শর্তটি নয়
আশকান সিরিস

4
@ স্টম এক্সিকিউট এসকিএলকম্যান্ড এই লক্ষ্যে ইএফ-তে বিদ্যমান আছে তবে আমি সম্মত হই যে এটি সুন্দর নয় :) যাইহোক, আমার বক্তব্যটি ছিল আপনি একটি এসকিউএল কমান্ড এবং একটি ভিন্ন ইএফ-সি # কোড লিখেছেন এবং দাবি করেছেন যে তারা সমান। :)
আশাকান সিরিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.