লিনক ক্যোয়ারী ফলাফলকে অভিধানে রূপান্তর করুন


346

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

এটি করতে, আমি যাচাইকরণের জন্য প্রয়োজনীয় হিসাবে সামান্য তথ্য আনতে চাই এবং কেবলমাত্র প্রক্রিয়াটির শুরুতে।

আমি এই জাতীয় কিছু করার কথা ভাবছিলাম, তবে স্পষ্টতই, এটি কাজ করে না। কারও ধারণা আছে?

Dictionary<int, DateTime> existingItems = 
    (from ObjType ot in TableObj
        select (new KeyValuePair<int, DateTime>(ot.Key, ot.TimeStamp))
    )

টেবিলবজেক্ট থেকে পুরো অবজেক্টটাইপ অবজেক্টগুলি ডাউনলোড না করেই আমি শেষে চাই একটি অভিধান হবে।

আমি নিম্নলিখিত কোডটিও বিবেচনা করেছি, তবে আমি একটি সঠিক উপায় খুঁজতে চেষ্টা করছিলাম:

List<int> keys = (from ObjType ot in TableObj orderby ot.Key select ot.Key).ToList<int>();
List<DateTime> values = (from ObjType ot in TableObj orderby ot.Key select ot.Value).ToList<int>();
Dictionary<int, DateTime> existingItems = new Dictionary<int, DateTime>(keys.Count);
for (int i = 0; i < keys.Count; i++)
{
    existingItems.Add(keys[i], values[i]);
}

উত্তর:


632

পদ্ধতিটি এভাবে ব্যবহার করারToDictionary চেষ্টা করুন :

var dict = TableObj.ToDictionary( t => t.Key, t => t.TimeStamp );

2
@ পাওয়ান, এটি গণনার প্রতিটি উপাদানগুলির জন্য একটি স্থানধারক এবং অঙ্কের মধ্যে বস্তুর ধরণটি গ্রহণ করে।
tvanfosson

1
@ পাওয়ান - এটি ঠিক দেখাচ্ছে না। আমি আশা করব var servers = list.Select( s => new { s.ProjectName, Url = "tcp://" + s.BuildMachineName + ":" + s.PortNumber + "/CruiseManager.rem" } ).ToDictionary( s => s.ProjectName, s.Url ); এটি প্রকল্পের নাম / ইউআরএল জোড়া প্রকল্পের নাম অনুসারে একটি অভিধান তৈরি করে।
tvanfosson

3
.Select( t => new { t.Key, t.TimeStamp } )অভিব্যক্তি কেন প্রয়োজনীয়?
বেন কলিন্স

9
@ বেনকোলিনস: আমি মনে করি মধ্যবর্তী মধ্য .Selectথেকে উত্পন্ন এসকিউএল কেবল প্রতিটি কলাম নির্বাচন না করে কেবল কী এবং টাইমস্ট্যাম্প নির্বাচন করে।
জোয়ি অ্যাডামস 16

1
আপনি Selectযদি লিনক টু অবজেক্ট (
লিঙ্কের

119

আপনার উদাহরণটি দেখে আমার মনে হয় আপনি এটি চান:

var dict = TableObj.ToDictionary(t => t.Key, t=> t.TimeStamp);

বাহ ... এটি সহজ হতে পারে ... যেহেতু আমি প্রোগ্রামিংয়ে বেশ নতুন, তাই আমি চেষ্টা করব এবং হুডের নীচে, পুরো বস্তুর হিট পাব না তা নিশ্চিত করার জন্য আমি একটু প্রোফাইলিং করব। আমি আপনাকে পোস্ট রাখতে হবে।
টিপেক্স

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

7
আপনি এটি করতে সক্ষম হতে পারেন: টেবিলবজ.সিলিউট (t => নতুন {t.Key, t.TimeStamp}) To লিনকটোসকিএল-তে লক্ষ্য রাখতে সক্ষম হওয়া উচিত যে আপনি কেবল দুটি জিনিস চান (নির্বাচন থেকে) এবং সেগুলি ফিরিয়ে দিন। আমি নিশ্চিত নই যে টোডেরিয়ার () এর সুনির্দিষ্ট দিকগুলি খননের জন্য এটি যথেষ্ট স্মার্ট।
টালজো

1
চমৎকার! এখানে ফলাফলের প্রশ্নটি রয়েছে: নির্বাচন করুন [টি0]। [কী], [টি0] [ আমি এর ক্রেডিট নিতে চাই না তাই এগিয়ে যান এবং এন্টার হিসাবে পোস্ট করুন! :
পি

8

নিম্নলিখিত চেষ্টা করুন

Dictionary<int, DateTime> existingItems = 
    (from ObjType ot in TableObj).ToDictionary(x => x.Key);

অথবা সম্পূর্ণরূপে প্রকারযুক্ত ইনফেরেন্টেড সংস্করণ

var existingItems = TableObj.ToDictionary(x => x.Key);

আনসার জেয়ার্ডপাড়ের জন্য ধন্যবাদ। আমি এরকম কিছু সম্পর্কে শিখিয়েছি, তবে আমি মনে করি এটি পুরোপুরি অবজেক্টটি ডাউনলোড না করে এড়াতে ওবজটাইপ ধরণের পুরো অবজেক্টগুলিকে এবং আইওয়ান্টকে ফিরিয়ে দেবে I
টিপেক্স

@ টিপেক্স, আপনি কী ফিল্টার করতে চান সে সম্পর্কে কিছু তথ্য সরবরাহ করতে পারেন? একটি ফিল্টার ধারা যোগ করা সম্ভব, তবে আমি আপনার প্রশ্ন থেকে বলতে পারব কি গুরুত্বপূর্ণ
জারেডপাড়

"নতুন সারি" যুক্ত করার দরকার আছে কিনা, আমাকে এড়িয়ে যাওয়ার বা অন্য সারিটি প্রতিস্থাপনের জন্য অবজেক্টের টাইমস্ট্যাম্প দরকার তা জানতে হবে। ডিবিতে অবজেক্টগুলির প্রচুর ক্ষেত্র রয়েছে যাচাইয়ের জন্য আমার প্রয়োজন নেই এবং আমি পুরো অবজেক্টগুলি পেয়ে পারফরম্যান্স হিট পেতে চাই না। এটি সহজ রাখতে, আমি আমার বিডিতে 20 টি কলাম, 100 000 সারি সহ একটি টেবিল পেয়েছি এবং আমি প্রথম 2 টি কলামের মান ব্যবহার করে একটি অভিধান বের করতে চাই।
টিপেক্স

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

0

নেমস্পেস ব্যবহার করুন

using System.Collections.Specialized;

DataContextক্লাসের উদাহরণ তৈরি করুন

LinqToSqlDataContext dc = new LinqToSqlDataContext();

ব্যবহার

OrderedDictionary dict = dc.TableName.ToDictionary(d => d.key, d => d.value);

মানগুলি পুনরুদ্ধার করতে নেমস্পেস ব্যবহার করুন

   using System.Collections;

ICollection keyCollections = dict.Keys;
ICOllection valueCollections = dict.Values;

String[] myKeys = new String[dict.Count];
String[] myValues = new String[dict.Count];

keyCollections.CopyTo(myKeys,0);
valueCollections.CopyTo(myValues,0);

for(int i=0; i<dict.Count; i++)
{
Console.WriteLine("Key: " + myKeys[i] + "Value: " + myValues[i]);
}
Console.ReadKey();

জন্য Multilple কী ?
কিকনেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.