লিনকিউতে সর্বোচ্চ তারিখ সহ কেবলমাত্র রেকর্ডগুলি কীভাবে নির্বাচন করবেন


117

নিম্নলিখিত ক্ষেত্রগুলির সাথে আমার একটি টেবিল, 'লাস্ট্রেসেস' রয়েছে।

Id, AccountId, Version, DownloadNo, Date

ডেটা দেখতে এমন দেখাচ্ছে:

28092|15240000|1.0.7.1782|2009040004731|2009-01-20 13:10:22.000
28094|61615000|1.0.7.1782|2009040007696|2009-01-20 13:11:38.000
28095|95317000|1.0.7.1782|2009040007695|2009-01-20 13:10:18.000
28101|15240000|1.0.7.1782|2009040004740|2009-01-20 14:10:22.000
28103|61615000|1.0.7.1782|2009040007690|2009-01-20 14:11:38.000
28104|95317000|1.0.7.1782|2009040007710|2009-01-20 14:10:18.000

লিনকিউ-তে এসকিউএল- এ আমি কীভাবে কেবল প্রতিটি অ্যাকাউন্টআইডির সর্বশেষ লাস্টট্রস পেতে পারি (সর্বোচ্চ তারিখের সাথে একটি)?


প্রকৃতপক্ষে আপনার উদাহরণে একই অ্যাকাউন্ট আইডি সহ সমস্ত লগগুলির সঠিক একই তারিখ থাকে, তবে সেই ক্ষেত্রে কোনটি অগ্রাধিকার গ্রহণ করে?
ব্ল্যাকটাইগারএক্স

উত্তর:


230

আপনি যদি প্রতিটি অ্যাকাউন্টের সবেমাত্র শেষ তারিখটি চান তবে আপনি এটি ব্যবহার করতে পারেন:

var q = from n in table
        group n by n.AccountId into g
        select new {AccountId = g.Key, Date = g.Max(t=>t.Date)};

আপনি যদি পুরো রেকর্ডটি চান:

var q = from n in table
        group n by n.AccountId into g
        select g.OrderByDescending(t=>t.Date).FirstOrDefault();

2
ওরাকল এটি সমর্থন করে না। যদি কোয়েরি পারফরম্যান্স আপনার বিবেচনার বাইরে না থাকে, আপনি কোয়েরি করার আগে আপনি টেবিল টুলিস্টে রূপান্তর করতে পারেন।
উইল

8
আপনি যদি এর method-chainজন্য কোনও সমাধান পোস্ট করতে পারেন তবে দুর্দান্ত হবে ।
LCJ

দ্বিতীয় জিজ্ঞাসা - এটি করা উচিত নয় (from n in table ...).First()?
জেসন এল

@ জেসনল, না। First()কলে আবেদন করতে হবে g.Order...অভিব্যক্তি (subquery)।
মেহরদাদ আফশারি

1
@ মেহরদাদ আফশারি আশ্চর্যজনক যে আমি দ্বিতীয়টি প্রাথমিকভাবে চেয়েছিলাম তবে তারা এখন আমার স্নিপকেটে খুব দরকারী হিসাবে রয়েছে । আপনাকে ধন্যবাদ, আপনাকে ধন্যবাদ আপনাকে ধন্যবাদ!!!!!
অ্যান্ড্রু ডে

52

এটি করার একটি সহজ উপায় এখানে

var lastPlayerControlCommand = this.ObjectContext.PlayerControlCommands
                                .Where(c => c.PlayerID == player.ID)
                                .OrderByDescending(t=>t.CreationTime)
                                .FirstOrDefault();

এই দুর্দান্ত লাইনকিউ জায়গাটি দেখুন - এসকিউএল নমুনাগুলি থেকে লিনকিউ


25
এই সমাধান কাজ করে জরিমানা যদি আপনি অ্যাকাউন্ট প্রতি অনুসন্ধান করা হয় কিন্তু কি ওপি বিবৃত, যা একটি AccountId (আপনার ক্ষেত্রে PlayerId মধ্যে) প্রদান না করেই সব রেকর্ডের জন্য সাম্প্রতিকতম ফলাফলের পেতে হয় করে না
Maciej

1
এই সমাধানটি আমাকে সর্বাধিক নির্বাচনের চেষ্টা করার পরিবর্তে অর্ডার করতে অনুপ্রাণিত করেছিল। +1
রাজ্জান ডুমিত্রু

এই সমাধানটি "সিকোয়েন্সে কোনও উপাদান নেই" বাড়ে পারে লিনকের ত্রুটি?
এক্সস্ক্রেপি

34

আপনি যদি পুরো রেকর্ডটি চান তবে এখানে ল্যাম্বদা উপায় রয়েছে:

var q = _context
             .lasttraces
             .GroupBy(s => s.AccountId)
             .Select(s => s.OrderByDescending(x => x.Date).FirstOrDefault());

1
দুর্দান্ত কাজ করেছেন ধন্যবাদ।
টেরি

এই এখানে চাবি।
জেসন পি স্যালিনগার

5

এটি এমন কিছু হতে পারে:

var qry = from t in db.Lasttraces
          group t by t.AccountId into g
          orderby t.Date
          select new { g.AccountId, Date = g.Max(e => e.Date) };

3

এটি করার জন্য একটি সহজ উপায় যান: -

নিম্নলিখিত তথ্য রাখার জন্য একটি শ্রেণি তৈরি করা হয়েছে

  • স্তর (সংখ্যা)
  • ইউআরএল (সাইটের url)

একটি অ্যারেলিস্ট অবজেক্টে সঞ্চিত সাইটের তালিকায় যান। এবং স্তরটিকে ক্রমানুসারে স্তর অনুসারে বাছাই করতে নিম্নলিখিত জিজ্ঞাসাটি কার্যকর করা হয়েছে।

var query = from MyClass object in objCollection 
    orderby object.Level descending 
    select object

একবার সংগ্রহটি সাজানোর ক্রমে সাজানো হয়ে গেলে, আমি শীর্ষের সারি হিসাবে আসা অবজেক্টটি পেতে নিম্নলিখিত কোডটি লিখেছিলাম

MyClass topObject = query.FirstRow<MyClass>()

এটি মোহন মত কাজ করে।


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