কীভাবে "এসএমকিএল করতে হবে সেখানে (মানগুলির তালিকায়)" লিনিক


101

আমার একটি ফাংশন রয়েছে যেখানে আমি আইডির একটি তালিকা পাই এবং আইডির সাথে সম্পর্কিত একটি বর্ণনার সাথে মিল রেখে আমার তালিকা ফিরিয়ে দিতে হবে। উদাহরণ:

public class CodeData
{
    string CodeId {get; set;}
    string Description {get; set;}
}

public List<CodeData> GetCodeDescriptionList(List<string> codeIDs)
    //Given the list of institution codes, return a list of CodeData
    //having the given CodeIds
}

সুতরাং আমি যদি নিজেই এই জন্য বিকাশ তৈরি করতাম তবে আমি কেবল নীচের মতো কিছু করতাম (যেখানে ক্লজটিতে কোডআইডস আর্গুমেন্টে সমস্ত মান রয়েছে):

Select CodeId, Description FROM CodeTable WHERE CodeId IN ('1a','2b','3')

লিনক থেকে এসকিএল-তে আমি "আইএন" ধারাটির সমতুল্য খুঁজে পাচ্ছি না। আমি এখনও অবধি সবচেয়ে ভাল খুঁজে পেয়েছি (যা কাজ করে না):

 var foo = from codeData in channel.AsQueryable<CodeData>()
           where codeData.CodeId == "1" || codeData.CodeId == "2"
           select codeData;

সমস্যা হ'ল, আমি লিনক থেকে এসকিএল করার জন্য "OR" ধারাগুলির তালিকাটি গতিশীলভাবে তৈরি করতে পারি না, কারণ সেগুলি সংকলনের সময় সেট করা আছে।

লিংক থেকে এসকিউএল ব্যবহার করে মানগুলির গতিশীল তালিকায় যে কলামটি চেক করে এমন একটি ক্লজটি কীভাবে কীভাবে সম্পন্ন হয়?

উত্তর:


159

ব্যবহার

where list.Contains(item.Property)

বা আপনার ক্ষেত্রে:

var foo = from codeData in channel.AsQueryable<CodeData>()
          where codeIDs.Contains(codeData.CodeId)
          select codeData;

তবে আপনি এটি ডট স্বরলিপিতেও করতে পারেন:

var foo = channel.AsQueryable<CodeData>()
                 .Where(codeData => codeIDs.Contains(codeData.CodeId));

কোডআইডের ক্ষেত্রে কীভাবে ব্যবহার করবেন এটি পূর্ণসংখ্যা ??
কিরণ সোলকার

2
@ কিরানসোলকার: তাহলে সম্ভবত codeIDsএকটি List<int>হবে এবং সব ঠিক আছে।
জন স্কিটি

@ জোনস্কিট কি বিষয়টি সংবেদনশীল নয়? কোডআইডিগুলি যদি বড় হাতের স্ট্রিংগুলির তালিকা থাকে এবং কোডডাটা কোড কোডটি ছোট হাতের স্ট্রিং হয় তবে এটি ব্যর্থ হবে।
পারসি জ্যাক

@ পেরসি জ্যাক: এটিকে কেস-সংবেদনশীল হওয়ার বিষয়ে প্রশ্নে কিছুই ছিল না। এটি হবে কি না তা হিসাবে, লিনকিউ থেকে এসকিউএল ডিফল্টরূপে কেস-সংবেদনশীলতা প্রয়োগ করে বা ডিবি সেটিংস এটি পরিচালনা করতে দেয় কিনা তা আমি মনে করতে পারি না।
জন স্কিটি

1
@ পার্সি জ্যাক লিনকিউ থেকে এসকিউএল টি-এসকিউএল কোয়েরি তৈরি করে, যা এসকিউএল সার্ভারে কেস-সংবেদনশীলতার জন্য ডেটাবেস সেটিংস ব্যবহার করে চালিত হয়। যদিও, যদি কেউ সতর্ক না হন, এবং মেমোরি অবজেক্টগুলিতে লিনকিউ প্রয়োগ করার আগে ক্যোয়ারির ফলাফলগুলি কার্যকর করেন, তবে তারা মেলানো ক্ষেত্রে সংবেদনশীলতার পরিণতি ভোগ করতে পারে।
জেরেফেথ

26

আপনি এটি ব্যবহার করতে পারেন:

List<int> codes = new List<int>();

codes.add(1);
codes.add(2);

var foo = from codeData in channel.AsQueryable<CodeData>()
          where codes.Any(code => codeData.CodeID.Equals(code))
          select codeData;

1
আমাদের আইকিউ টুলকিট বাস্তবায়ন সমর্থন না করায় আমাকে এটি ব্যবহার করতে হয়েছিল ont কন্টেন্টস ()
ডিজে ভ্যান উইক

1

জন স্কিটির উত্তরে আমি এই পদ্ধতিটি ব্যবহার করছিলাম, তবে অন্য একটি ব্যবহার করে আমার সাথে ঘটেছে ConcatConcatপদ্ধতি হল একটি সীমিত পরীক্ষার সামান্য ভাল সঞ্চালিত, কিন্তু এটা একটা ঝগড়া এবং আমি সম্ভবত দিয়ে বিদ্ধ করব Contains, হয়তো বা আমি আমার জন্য এই কাজ করতে একটি সাহায্যকারী পদ্ধতি লিখতে হবে। যে কোনও উপায়ে, যদি কেউ আগ্রহী হয় তবে এখানে অন্য বিকল্প রয়েছে:

পদ্ধতি

// Given an array of id's
var ids = new Guid[] { ... };

// and a DataContext
var dc = new MyDataContext();

// start the queryable
var query = (
    from thing in dc.Things
    where thing.Id == ids[ 0 ]
    select thing 
);

// then, for each other id
for( var i = 1; i < ids.Count(); i++ ) {
    // select that thing and concat to queryable
    query.Concat(
        from thing in dc.Things
        where thing.Id == ids[ i ]
        select thing
    );
}

কর্মক্ষমতা পরীক্ষা

এটি দূর থেকে বৈজ্ঞানিক ছিল না। আমি কল্পনা করি আপনার ডাটাবেস কাঠামো এবং তালিকার সাথে জড়িত আইডির সংখ্যা উল্লেখযোগ্য প্রভাব ফেলবে।

আমি একটি পরীক্ষা সেটআপ করেছি যেখানে আমি প্রত্যেকটি 100 টি ট্রায়াল করেছি Concatএবং Containsযেখানে প্রতিটি পরীক্ষায় প্রাথমিক কীগুলির একটি এলোমেলো তালিকা দ্বারা নির্দিষ্ট 25 সারি নির্বাচন করা জড়িত। আমি এটি প্রায় এক ডজন বার চালিয়েছি এবং বেশিরভাগ সময় Concatপদ্ধতিটি 5 - 10% দ্রুত বেরিয়ে আসে, যদিও এক সময় Containsপদ্ধতিটি কেবল একটি স্মিডজেন দ্বারা জিতেছিল।


0
 var filterTransNos = (from so in db.SalesOrderDetails
                    where  ItemDescription.Contains(ItemDescription)
                            select new { so.TransNo }).AsEnumerable();    


listreceipt = listreceipt.Where(p => filterTransNos.Any(p2 => p2.TransNo == p.TransNo)).ToList();

-1

এখানে আমি হ্যাশসেট ব্যবহার করে এটি কীভাবে করব

        HashSet<String> hs = new HashSet<string>(new String[] { "Pluto", "Earth", "Neptune" });
        String[] arr =
        {
            "Pluto",
            "Earth",
            "Neptune",
            "Jupiter",
            "Saturn",
            "Mercury",
            "Pluto",
            "Earth",
            "Neptune",
            "Jupiter",
            "Saturn",
            "Mercury",
            // etc.
        };
        ICollection<String> coll = arr;

        String[] arrStrFiltered = coll.Where(str => hs.Contains(str)).ToArray();

হ্যাশসেটটি মূলত প্রায় ও (1) এর কাছে তাই আপনার জটিলতা ও (এন) থেকে যায়।


এটি লিনিক্যু-থেকে-এসকিউএল সম্পর্কে। এই জাতীয় লিনকু-থেকে-অবজেক্ট বিবেচনা প্রয়োগ হয় না।
গার্ট আর্নল্ড

আইকোলিকেশনটি একটি লিনকিউ-এসকিউএল থেকেও আসতে পারে, এটি সাধারণ উপায়
এমজি

প্রশ্নটি কীভাবে একটি এক্সপ্রেশন তৈরি করতে হয় যা সঠিক এসকিউএলে অনুবাদ করে। স্থানীয় সংগ্রহে কীভাবে অনুসন্ধান করা যায় তার সাথে এর কোনও যোগসূত্র নেই। আপনার উত্তরটি কেবল ভবিষ্যতের পাঠকদেরকে বিভ্রান্ত করবে যে এই পার্থক্য সম্পর্কে অবগত নয়।
গার্ট আর্নল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.