সত্তা ফ্রেমওয়ার্ক ব্যবহার করে কীভাবে কোনও কলামের সর্বোচ্চ মান পাবেন?


92

পূর্ণসংখ্যা সহ একটি কলামের সর্বাধিক মান পেতে, আমি নিম্নলিখিত টি-এসকিউএল কোম্যান্ড ব্যবহার করতে পারি

SELECT MAX(expression )
FROM tables
WHERE predicates;

সত্তা ফ্রেমওয়ার্কের সাথে কি একই ফলাফল পাওয়া সম্ভব?

ধরা যাক আমার নীচের মডেলটি রয়েছে

public class Person
{
  public int PersonID { get; set; }
  public int Name { get; set; }
  public int Age { get; set; }
}

আমি কীভাবে সবচেয়ে বয়স্ক ব্যক্তির বয়স পেতে পারি?

int maxAge = context.Persons.?

উত্তর:


152

এটা চেষ্টা কর int maxAge = context.Persons.Max(p => p.Age);

এবং using System.Linq;আপনার ফাইলের শীর্ষে রয়েছে তা নিশ্চিত করুন


4
আমি এর সাথে কিছুটা লড়াই করেছি কারণ আমি "সিস্টেম.লিনক ব্যবহার করে" মিস করেছি; আমার মতো
নবাগতদের আপনার উত্তরটিতে

4
কোনও সমস্যা নেই @ রাগনাআরক
ক্রোলিক

4
তবে যদি আপনার কোনও রেকর্ড না থাকে এবং EF ত্রুটিগুলি না করে। আমার সংযোজন ভার মডেল = db.BillOfLading.Select (x => x.No) .LastOrDefault (); if (মডেল! = নাল) {var ভাল = db.BillOfLading.Max (x => x.No);
হারজিজ

এটা কি দক্ষ? অথবা সত্তা কাঠামো সর্বাধিক ফাংশন ব্যবহার করে এমন একটি সঞ্চিত পদ্ধতি কার্যকর করা ভাল কি? সত্তা কাঠামোর জন্য নতুন এবং সত্যই কৌতূহলী
অস্থায়ী

@ প্রোগ্রামাম্যাটিক এমন কোনও কারণ নেই যা আরও কার্যকর হবে।
এসকিএল

49

তালিকাটি ফাঁকা থাকলে আমি ব্যতিক্রম পাই। এই সমাধানটি এই ইস্যুকে বিবেচনা করবে:

int maxAge = context.Persons.Select(p => p.Age).DefaultIfEmpty(0).Max();

7
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। সার্ভারে কেবল একটি রাউন্ড ট্রিপ এবং কোনও ব্যতিক্রম নেই।
9

4
তবে এটি ডাটাবেস থেকে সমস্ত কলাম মান পুনরুদ্ধার করে এবং সর্বোচ্চ প্রয়োগ প্রয়োগ করে।
সুপারডাক

4
এটি 3 টি উপ-প্রশ্ন করে। আমি একটি ভিন্ন উত্তর প্রস্তাব।
jsgoupil

4
শুধু একটি পার্শ্ব নোট - এটি EF কোর দিয়ে কাজ করে না। আমি ব্যবহার করেছি:await _context.Persons.MaxAsync(x => (int?)x.Age) ?? 0
egmfrs


7

আপনি যদি কিছু ফিল্টার যুক্ত করতে চান তবে সাহায্য করুন:

context.Persons
.Where(c => c.state == myState)
.Select(c => c.age)
.DefaultIfEmpty(0)
.Max();


4

আপনার কলামটি বাতিল হয়

int maxAge = context.Persons.Select(p => p.Age).Max() ?? 0;

আপনার কলামটি অযোগ্য ul

int maxAge = context.Persons.Select(p => p.Age).Cast<int?>().Max() ?? 0;

উভয় ক্ষেত্রেই, আপনি দ্বিতীয় কোডটি ব্যবহার করতে পারেন। আপনি যদি ব্যবহার করেন তবে আপনি DefaultIfEmptyআপনার সার্ভারে আরও বড় প্রশ্ন করবেন। আগ্রহী ব্যক্তিদের জন্য, এখানে EF6 সমতুল্য:

ছাড়া জিজ্ঞাসা DefaultIfEmpty

SELECT 
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT 
        MAX([Extent1].[Age]) AS [A1]
        FROM [dbo].[Persons] AS [Extent1]
    )  AS [GroupBy1]

সাথে প্রশ্ন DefaultIfEmpty

SELECT 
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT 
        MAX([Join1].[A1]) AS [A1]
        FROM ( SELECT 
            CASE WHEN ([Project1].[C1] IS NULL) THEN 0 ELSE [Project1].[Age] END AS [A1]
            FROM   ( SELECT 1 AS X ) AS [SingleRowTable1]
            LEFT OUTER JOIN  (SELECT 
                [Extent1].[Age] AS [Age], 
                cast(1 as tinyint) AS [C1]
                FROM [dbo].[Persons] AS [Extent1]) AS [Project1] ON 1 = 1
        )  AS [Join1]
    )  AS [GroupBy1]

4
কীint maxAge = context.Persons.Max(x => (int?)x.Age) ?? 0;
উদাহরণস্বরূপ

3

অনেকেই বলেছিলেন - এই সংস্করণটি

int maxAge = context.Persons.Max(p => p.Age);

টেবিলটি খালি থাকলে একটি ব্যতিক্রম ছুঁড়ে।

ব্যবহার

int maxAge = context.Persons.Max(x => (int?)x.Age) ?? 0;

বা

int maxAge = context.Persons.Select(x => x.Age).DefaultIfEmpty(0).Max()

আপনার দ্বিতীয় উত্তরটি আমার কাছে ভাল লাগছে, যদি কেউ উত্পন্ন এসকিউএল দেখে তবে দ্বিতীয় উত্তরটি ভাল।
দীপক শর্মা


2
int maxAge = context.Persons.Max(p => p.Age);

এই সংস্করণটি, তালিকাটি ফাঁকা থাকলে :

  • রিটার্ন null- nullable ওভারলোডগুলির জন্য
  • Sequence contains no elementব্যতিক্রম ছুঁড়ে - নন-অযোগ্য ওভারলোডগুলির জন্য

-

int maxAge = context.Persons.Select(p => p.Age).DefaultIfEmpty(0).Max();

এই সংস্করণটি খালি তালিকার কেসটি পরিচালনা করে তবে এটি আরও জটিল কোয়েরি উত্পন্ন করে এবং কোনও কারণে EF কোরের সাথে কাজ করে না।

-

int maxAge = context.Persons.Max(p => (int?)p.Age) ?? 0;

এই সংস্করণটি মার্জিত এবং পারফরম্যান্ট (সাধারণ ক্যোয়ারী এবং ডাটাবেসে একক রাউন্ড-ট্রিপ), EF কোরের সাথে কাজ করে। এটি উপরোক্ত উল্লিখিত ব্যতিক্রমটি অ-নোলযোগ্য টাইপটিকে নালযোগ্য এবং তার পরে ??অপারেটরটি ব্যবহার করে ডিফল্ট মান প্রয়োগ করে les


1

নির্বাচিত উত্তর ব্যতিক্রম ছুঁড়ে ফেলেছে এবং কার্লোস টলেডোর উত্তর ডেটাবেস থেকে সমস্ত মান পুনরুদ্ধার করার পরে ফিল্টারিংয়ের ক্ষেত্রে প্রযোজ্য।

নিম্নলিখিতটি একটি একক রাউন্ড-ট্রিপ চালায় এবং কোনও ব্যতিক্রম ছাড়াই যে কোনও সম্ভাব্য সূচী ব্যবহার করে একটি একক মান পড়বে।

int maxAge = _dbContext.Persons
  .OrderByDescending(p => p.Age)
  .Select(p => p.Age)
  .FirstOrDefault();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.