আইডির তালিকা থেকে সত্তা ফ্রেমওয়ার্কে একাধিক সারি আপডেট করুন


95

আমি সত্তা কাঠামোর জন্য একটি ক্যোয়ারী তৈরি করার চেষ্টা করছি যা আমাকে আইডির একটি তালিকা নেবে এবং তাদের সাথে যুক্ত একটি ক্ষেত্র আপডেট করবে।

এসকিউএল উদাহরণ:

UPDATE Friends
SET msgSentBy = '1234'
WHERE id IN (1, 2, 3, 4)

আমি কীভাবে উপরেরটি সত্তার কাঠামোর মধ্যে রূপান্তর করব?


আপনার ডাটাবেস প্ল্যাটফর্ম কী ওরাকল মাইএসকিএল ..
জি

আমার ডাটাবেসটি মাইক্রোসফ্ট এসকিউএল
04

: দুটি ওপেন সোর্স প্রকল্প এই অনুমতি দেওয়া হচ্ছে EntityFramework.Extended ও ই ntity ফ্রেমওয়ার্ক এক্সটেনশানগুলি
পিটার কের

এর একমাত্র সঠিক উত্তর: আপনি পারবেন না। অবশ্যই, আপনি ডাটাবেস থেকে সমস্ত মিলে যাওয়া Friendগুলি টানতে এবং তাদের সম্পত্তি আপডেট করতে msgSentByএবং পরিবর্তনগুলি সংরক্ষণ করতে পারেন। তবে ইএফ UPDATEপ্রতিটি স্বতন্ত্র রেকর্ডের জন্য বিবৃতি ফায়ার করবে । এটি এক-বিবৃতি বাল্ক আপডেট হিসাবে মোটেও একই নয়। যেমন বলা হয়েছে, তৃতীয় পক্ষের লাইব্রেরিটি সন্ধান করুন যা বাল্ক আপডেট দেয়।
গার্ট আর্নল্ড

উত্তর:


167

নীচের মত কিছু

var idList=new int[]{1, 2, 3, 4};
using (var db=new SomeDatabaseContext())
{
    var friends= db.Friends.Where(f=>idList.Contains(f.ID)).ToList();
    friends.ForEach(a=>a.msgSentBy='1234');
    db.SaveChanges();
}

হালনাগাদ:

আপনি নীচে হিসাবে একাধিক ক্ষেত্র আপডেট করতে পারেন

friends.ForEach(a =>
                      {
                         a.property1 = value1;
                         a.property2 = value2;
                      });

আপনি উপরে প্রেরণায় আমি একাধিক ক্ষেত্র আপডেট করতে পারি যা আপনি স্রেফ পাঠিয়েছিলেন যা আমি চেয়েছিলাম ঠিক তা-ই। আপনি আরও কিছু করতে পারে যদি শুধু কৌতূহল? সাবমিট চেঞ্জগুলি এখন আর বেশিরভাগ কাজ করে না বলে মনে হচ্ছে। আমি সর্বশেষ সত্তা ফ্রেমওয়ার্ক ব্যবহার করছি। হয়তো সেভচেনজেস ()?
2:25 এ এলকোডড

10
ForEachএটি একটি পদ্ধতি Listএবং এটি ব্যবহারে সাধারণত নিরুৎসাহিত করা হয় কারণ এটি প্রোগ্রামিংয়ের খুব কার্যকরী উপায় নয়। একজন সাধারণ ব্যক্তির মতো কেবল foreach (অপারেটর) ব্যবহার করুন ।
ব্লুরাজা - ড্যানি পিফ্লুঘুফ্ট

55
এই সমাধানটি ব্যবহার করে তালিকার প্রতিটি উপাদানগুলির জন্য একটি আপডেট ক্যোয়ারী উত্পন্ন হয়। প্রশ্নে মত একটি প্রশ্ন জিজ্ঞাসা করার জন্য কি EF পাওয়ার কোনও উপায় আছে? ( UPDATE SomeTable SET SomeField = SomeValue WHERE Id IN (...))
রামনো

19
সাবধান থাকুন যে এটি একটি ডাটাবেসের দৃষ্টিকোণ থেকে এটি প্রায় একটি অদক্ষ উপায়। এটি কেবলমাত্র বন্ধু সারণী থেকে প্রতিটি সারি জড়িত একটি বড় নির্বাচন বিবৃতি ইস্যু করে না, তবে আপডেট হওয়া প্রতিটি রেকর্ডের জন্য এটি একটি পৃথক আপডেটের কমান্ড জারি করে। সুতরাং একটি কমান্ড জারি করার পরিবর্তে আপনি সম্ভাব্য অনেকগুলি কমান্ডের পাশাপাশি আপনার ডেটাবেস থেকে প্রচুর ডেটা স্ট্রিমিংয়ের বিষয়টিও বটে।
d512

4
@ শেখারপঙ্কজ, মূলত আপনি যা করতে চান তা হ'ল "UPDATE Friends SET msgSentBy = '1234' WHERE ID IN (1, 2, 3, 4)" এর মতো একটি এসকিউএল কমান্ড দেওয়া। আমি মনে করি না যে এটি করার জন্য ইএফের প্রত্যক্ষ সমর্থন রয়েছে। আমি বিশ্বাস করি এর কয়েকটি তৃতীয় পক্ষের সমাধান রয়েছে ( স্ট্যাকওভারফ্লো / প্রশ্ন / 12751258 / batch-update-delete-ef5 ) তবে আমি সেগুলি ব্যবহার করি নি। অন্যান্য বিকল্পগুলি হ'ল EF এর পরিবর্তে কাঁচা ADO.NET ব্যবহার করা।
d512

-1
var idList=new int[]{1, 2, 3, 4};
var friendsToUpdate = await Context.Friends.Where(f => 
    idList.Contains(f.Id).ToListAsync();

foreach(var item in previousEReceipts)
{
  item.msgSentBy = "1234";
}

আপনার শর্ত পূরণ করে এমন প্রতিটি উপাদান আপডেট করতে আপনি অগ্রণী ব্যবহার করতে পারেন।

আরও জেনেরিক উপায়ে এখানে একটি উদাহরণ দেওয়া হল:

var itemsToUpdate = await Context.friends.Where(f => f.Id == <someCondition>).ToListAsync();

foreach(var item in itemsToUpdate)
{
   item.property = updatedValue;
}
Context.SaveChanges()

সাধারণভাবে আপনি সম্ভবত ডিবি ক্যোয়ারির জন্য অপেক্ষা সহ অ্যাসিঙ্ক পদ্ধতি ব্যবহার করবেন।


আমি দেখতে পাচ্ছি না এটি কীভাবে বিদ্যমান উত্তরে কিছু যুক্ত করে। এটি মূলত এটি পুনরাবৃত্তি করে।
গার্ট আর্নল্ড

মূল পার্থক্য friends.ForEach পরিবর্তে ব্যবহার foreach হয়
রাফায়েল Pinel
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.