লিনকিউ একটি একক সারি নির্বাচন করতে সর্বোচ্চ () ব্যবহার করে


98

আমি এনএইচবারনেট থেকে ফিরে আইকিউয়েরেবলের জন্য লিনকিউ ব্যবহার করছি এবং কয়েকটি ক্ষেত্রের সর্বাধিক মান (গুলি) দিয়ে আমার সারিটি নির্বাচন করতে হবে।

আমি যেটুকু স্টিক করছি সেটিকে আমি সরল করে তুলেছি। আমার টেবিল থেকে এক ক্ষেত্রের সর্বাধিক মান সহ একটি সারি নির্বাচন করতে হবে।

var table = new Table { new Row(id: 1, status: 10), new Row(id: 2, status: 20) }

from u in table
group u by 1 into g
where u.Status == g.Max(u => u.Status)
select u

এটি ভুল তবে আমি সঠিক ফর্মটি নিয়ে কাজ করতে পারি না।

বিটিডাব্লু, আমি যা অর্জন করতে চাইছি এটি প্রায়:

var clientAddress = this.repository.GetAll()
    .GroupBy(a => a)
    .SelectMany(
            g =>
            g.Where(
                a =>
                a.Reference == clientReference && 
                a.Status == ClientStatus.Live && 
                a.AddressReference == g.Max(x => x.AddressReference) && 
                a.StartDate == g.Max(x => x.StartDate)))
    .SingleOrDefault();

আমি উপরের ল্যাম্বডা দিয়ে শুরু করেছি তবে আমি লিনিকপ্যাড ব্যবহার করছি সর্বাধিক () নির্বাচনের জন্য সিনট্যাক্স চেষ্টা করে দেখানোর জন্য।

হালনাগাদ

গ্রুপবাই সরানো মুখ্য বিষয় ছিল।

var all = this.repository.GetAll();

var address = all
            .Where(
                a =>
                a.Reference == clientReference && 
                a.Status == ClientStatus.Live && 
                a.StartDate == all.Max(x => x.StartDate) &&
                a.AddressReference == all.Max(x => x.AddressReference))
            .SingleOrDefault();

সম্ভাব্য প্রতিলিপির: stackoverflow.com/questions/1101841/...
M.Babcock

: @ M.Babcock একটা ভাল উত্তর বেশ দূরে যে প্রশ্নে ডাউন ছিল stackoverflow.com/a/6330485/444244
Boggin

এর চেয়ে আরও ভাল কিছু আছে ...
এমব্যাবকক


@ সার্জ আমি সম্মত হই যে মোড়লিংক সেরা হবে তবে আমি ভয় করি যে এই প্রকল্পটি নতুন গ্রন্থাগার যুক্ত করার ক্ষেত্রে প্রতিবন্ধকতা সৃষ্টি করেছে।
বোগগিন ২২ শে

উত্তর:


235

আপনি এখানে গ্রুপ করছেন কেন তা আমি দেখতে পাচ্ছি না।

এটা চেষ্টা কর:

var maxValue = table.Max(x => x.Status)
var result = table.First(x => x.Status == maxValue);

একটি বিকল্প পদ্ধতি যা tableকেবল একবারে পুনরাবৃত্তি হবে এটি হবে :

var result = table.OrderByDescending(x => x.Status).First();

যদি এটি কি সহায়ক tableএকটি হল IEnumerable<T>যে মেমরি উপস্থিত নেই বা যে উড়ে গণনা করা হয়।


4
আমি from u in User_Accounts where u.Status == User_Accounts.Max(y => y.Status) select u
গ্রুপিংটি

4
আপনি ল্যাম্বদা সিনট্যাক্সও table.First(x => x.Status == table.Max(x => x.Status))
বাসাতে পারেন

15
@ ল্যান্ডনপোচ: এটি কোনও ভাল ধারণা নয়, কারণ এটি এন এর আইটেমের সংখ্যা হিসাবে সর্বাধিক এন বার গণনা করবে table
ড্যানিয়েল হিলগারথ

4
@ ড্যানিয়েল হিলগার্থ: ভাল ক্যাচ! এটি টেবিলের প্রতিটি সারিতে সর্বাধিক গণনা করবে। আমার খারাপ।
ল্যান্ডন পোচ


13

আপনি স্থিতি অনুসারে গ্রুপ করতে পারেন এবং বৃহত্তম গ্রুপ থেকে একটি সারি নির্বাচন করতে পারেন:

table.GroupBy(r => r.Status).OrderByDescending(g => g.Key).First().First();

প্রথমটি First()প্রথম গ্রুপ পায় (বৃহত্তম স্ট্যাটাস সহ সারিগুলির সেট); দ্বিতীয়টি First()সেই গোষ্ঠীতে প্রথম সারিতে আসে।
অবস্থা হয়, তাহলে সবসময় unqiue, আপনি দ্বিতীয় প্রতিস্থাপন করতে পারেন First()সঙ্গে Single()


7

প্রথম প্রশ্নের সম্বোধন করে, আপনার যদি সর্বাধিক মান সহ অন্যান্য কলামের সাথে নির্দিষ্ট মানদণ্ড অনুসারে কয়েকটি সারি গ্রহণের প্রয়োজন হয় তবে আপনি এই জাতীয় কিছু করতে পারেন:

var query =
    from u1 in table
    join u2 in (
        from u in table
        group u by u.GroupId into g
        select new { GroupId = g.Key, MaxStatus = g.Max(x => x.Status) }
    ) on new { u1.GroupId, u1.Status } equals new { u2.GroupId, Status = u2.MaxStatus}
    select u1;

0

আরও একটি উদাহরণ:

অনুসরণ করুন:

 qryAux = (from q in qryAux where
            q.OrdSeq == (from pp in Sessao.Query<NameTable>() where pp.FieldPk
            == q.FieldPk select pp.OrdSeq).Max() select q);

সমান:

 select t.*   from nametable t  where t.OrdSeq =
        (select max(t2.OrdSeq) from nametable t2 where t2.FieldPk= t.FieldPk)

-1

কেবল একটি লাইনে:

var result = table.First(x => x.Status == table.Max(y => y.Status));

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


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