লিনকিউ টু সত্তা পদ্ধতিটি শেষ পর্যন্ত স্বীকৃতি দেয় না। সত্যি?


144

এই ক্যোয়ারিতে:

public static IEnumerable<IServerOnlineCharacter> GetUpdated()
{
    var context = DataContext.GetDataContext();
    return context.ServerOnlineCharacters
        .OrderBy(p => p.ServerStatus.ServerDateTime)
        .GroupBy(p => p.RawName)
        .Select(p => p.Last());
}

এটি কাজ করার জন্য আমাকে এটিতে এটি পরিবর্তন করতে হয়েছিল

public static IEnumerable<IServerOnlineCharacter> GetUpdated()
{
    var context = DataContext.GetDataContext();
    return context.ServerOnlineCharacters
        .OrderByDescending(p => p.ServerStatus.ServerDateTime)
        .GroupBy(p => p.RawName)
        .Select(p => p.FirstOrDefault());
}

আমি p.First()প্রথম জিজ্ঞাসাটি আয়না করতে ব্যবহার করতে পারি না ।

অন্যথায় এ জাতীয় শক্তিশালী ওআরএম সিস্টেমের মধ্যে কেন এমন মৌলিক সীমাবদ্ধতা রয়েছে?


আপনার আইনিংরেবল অবজেক্টটিকে একটি নতুন ভেরিয়েবলের মধ্যে সঞ্চয় করুন, তারপরে ভেরিয়েবল.স্ট () ফিরে আসুন। এটা কাজ করবে।
আলী.রশিদি

উত্তর:


220

এই সীমাবদ্ধতাটি এই সিদ্ধান্তে নেমে আসে যে শেষ পর্যন্ত এসকিউএল এবং এসকিউএল- তে এই ক্যোয়ারীটি অনুবাদ করতে হবে তবে একটি SELECT TOP(টি-এসকিউএল) আছে তবে একটি নয় SELECT BOTTOM(এ জাতীয় কোনও জিনিস নেই)।

এটির চারপাশে একটি সহজ উপায় রয়েছে তবে, কেবল নেমে অর্ডার করুন এবং তারপরে একটি করুন First(), যা আপনি করেছিলেন।

সম্পাদনা: অন্যান্য সরবরাহকারীদের সম্ভবত বিভিন্ন বাস্তবায়ন হবে SELECT TOP 1, ওরাকলে এটি সম্ভবত আরও ভাল কিছু হবেWHERE ROWNUM = 1

সম্পাদনা করুন:

আরেকটি কম দক্ষ বিকল্প - আমি এটি প্রস্তাব দিই না! - এর .ToList()আগে আপনার ডেটাতে কল করা .Last(), যা অবিলম্বে লাইনক টু সত্তা এক্সপ্রেশনকে কার্যকর করা হবে যা সেই বিন্দু অবধি নির্মিত হয়েছে এবং তারপরে আপনার শেষ () কাজ করবে, কারণ সেই সময়ে .Last()কার্যকরভাবে একটি প্রসঙ্গে প্রাসঙ্গিকভাবে কার্যকর করা হয় পরিবর্তে অবজেক্ট এক্সপ্রেশন থেকে লিনকো । (এবং আপনি যেমন উল্লেখ করেছেন, এটি হাজার হাজার রেকর্ড এবং সিপিইউতে ব্যবহৃত বস্তু যা কখনও ব্যবহার হবে না এমন বস্তুর অপচয় করতে পারে)

আবার, আমি এটি দ্বিতীয় করার পরামর্শ দিচ্ছি না, তবে এটি লিনকিউ এক্সপ্রেশনটি কখন এবং কখন কার্যকর করা হয় তার মধ্যে পার্থক্য বোঝাতে সহায়তা করে।


এবং লিনকিউ টু এসকিউএল এই পরিস্থিতিটির সাথে কীভাবে কাজ করে?
bevacqua

@ নীল হ্যাঁ আমি জানি আমি টোলিস্টকে কল করতে পারি, তবে কেবলমাত্র পাঁচটি রেকর্ডে ফিল্টার করার জন্য আমি ডাটাবেস থেকে হাজার হাজার রেকর্ড পুনরুদ্ধার করব না
বেভাকাকুয়া

2
যদি আপনি জানেন যে আপনার জিজ্ঞাসাটি ছোট ফলাফলগুলি ফিরিয়ে আনতে চলেছে, কল করা ToListখুব খারাপ নয়।
জাস্টিন স্কাইলস

35

পরিবর্তে Last(), এটি চেষ্টা করুন:

model.OrderByDescending(o => o.Id).FirstOrDefault();

14

Last()একটি লিনক নির্বাচকের মাধ্যমে প্রতিস্থাপন করুনOrderByDescending(x => x.ID).Take(1).Single()

আপনি যদি লিন্কে এটি করতে পছন্দ করেন তবে এর মতো কিছু কাজ করবে:

public static IEnumerable<IServerOnlineCharacter> GetUpdated()
{
    var context = DataContext.GetDataContext();
    return context.ServerOnlineCharacters.OrderBy(p => p.ServerStatus.ServerDateTime).GroupBy(p => p.RawName).Select(p => p.OrderByDescending(x => x.Id).Take(1).Single());
}

1
ব্যবহার করার কোনও কারণ আছে কি?
টট জ্যাম 16

2
@ টটজাম বৈধ প্রতিস্থাপনটি হবে that এক্ষেত্রে প্রথম (), যেহেতু একক () আইটেমের গণনা ঠিক 1 না হলে একটি ব্যতিক্রম ছুঁড়ে
ফেলেছে

0

আর একটি উপায় অর্ডারবাইডেসেন্ডিং ছাড়াই শেষ উপাদানটি পান এবং সমস্ত সত্ত্বাকে লোড করুন:

dbSet
    .Where(f => f.Id == dbSet.Max(f2 => f2.Id))
    .FirstOrDefault();

0

এজন্য যে লাইনকিউ থেকে সত্তা (এবং সাধারণভাবে ডাটাবেসগুলি) সমস্ত লিনিকিউ পদ্ধতি সমর্থন করে না (বিশদগুলির জন্য এখানে দেখুন: http://msdn.microsoft.com/en-us/library/bb738550.aspx )

আপনার এখানে যা দরকার তা হ'ল আপনার ডেটাটি এমনভাবে অর্ডার করা যাতে "শেষ" রেকর্ডটি "প্রথমে" হয়ে যায় এবং তারপরে আপনি ফার্স্টআরডিফল্ট ব্যবহার করতে পারেন। নোট করুন যে ডাটাবেসটিতে সাধারণত "প্রথম" এবং "শেষ" এর মতো ধারণাগুলি থাকে না, এটি সর্বাধিক সন্নিবেশিত রেকর্ডটি টেবিলে "শেষ" হবে না।

এই পদ্ধতিটি আপনার সমস্যার সমাধান করতে পারে

db.databaseTable.OrderByDescending(obj => obj.Id).FirstOrDefault();

-2

AsEnumerable()সিলেক্ট ফাংশনটি আমার পক্ষে কাজ করার আগে একটি একক ফাংশন যুক্ত করা ।
উদাহরণ:

return context.ServerOnlineCharacters
    .OrderByDescending(p => p.ServerStatus.ServerDateTime)
    .GroupBy(p => p.RawName).AsEnumerable()
    .Select(p => p.FirstOrDefault());

রেফ: https://www.codeproject.com/Questions/1005274/LINQ-to-Entities-does-not-recognize-the- মিথ্যাবাদী- সিস


আপনার উত্তরের লিঙ্ক থেকে কার্যকারী কোডটি যুক্ত করার পরামর্শ দেওয়া হচ্ছে। কেবল লিঙ্ক-উত্তর উত্তর নেতিবাচক মনোযোগ আকর্ষণ করবে। সমস্যাটি সমাধানে সহায়তা ও সমাধান করতে আপনি খুঁজে পেয়েছেন এমন কোড যুক্ত করে একটি সম্পূর্ণ উত্তর সরবরাহ করুন। ভবিষ্যতে 404 ত্রুটির কারণে এটি লিঙ্কগুলি কাজ না করে এমন সমস্যার সমাধান করে।
স্টুডকো

1
আমার উত্তরে উদাহরণ জুড়েছে
আর্টেম লেভিটিন

এই উত্তরের নীচের দিকটি হ'ল এটি "আসনযোগ্য" সার্ভারের আগে সমস্ত ফলাফল আনবে এবং তারপরে প্রথমটি নির্বাচন করবে। এটি খুব অবাঞ্ছিত হতে পারে। (আমার এমন পরিস্থিতি হয়েছিল যেখানে 20k + রেকর্ডগুলি সার্ভার-সাইড আনার কারণে ফলাফলগুলি 20+ সেকেন্ড সময় নিয়েছিল, একবার আমি এটি ডিবি সাইডে ফিরিয়ে
আনলে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.