एंटिटी फ्रेमवर्क का उपयोग करके कॉलम का अधिकतम मूल्य कैसे प्राप्त करें?


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;आपकी फ़ाइल के शीर्ष पर है


2
मैंने इसके साथ थोड़ा संघर्ष किया क्योंकि मैं "System.Linq का उपयोग करने से चूक गया;" आपको मेरे उत्तर जैसे newbies के लिए अपने जवाब में उस जानकारी को जोड़ने पर विचार करना चाहिए :)
RagnaRock

2
कोई समस्या नहीं @RagnaRock
krolik

3
लेकिन क्या होगा अगर आपके पास कोई रिकॉर्ड नहीं है और EF त्रुटियां करता है। मेरा जोड़ var मॉडल = db.BillOfLading.Select (x => x.No) .LastOrDefault (); if (मॉडल! = null) {var val = db.BillOfLading.Max (x => x.No);
हर्जीज

क्या यह कुशल है? या मैक्स फंक्शन का उपयोग करने वाली एक संग्रहीत प्रक्रिया को निष्पादित करने के लिए इकाई ढांचा रखना बेहतर होगा? नई इकाई संरचना के लिए और वास्तव में उत्सुक हूँ
TemporaryFix

@Programmatic बिल्कुल कोई कारण नहीं है जो अधिक कुशल होगा। Sql सर्वर संस्करण को छोड़कर <= 7.
mxmissile

49

यदि सूची खाली है, तो मुझे एक अपवाद मिलेगा। यह समाधान इस मुद्दे को ध्यान में रखेगा:

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

7
यह स्वीकृत उत्तर होना चाहिए। केवल एक राउंड ट्रिप सर्वर और कोई अपवाद नहीं है।
9

4
लेकिन यह डेटाबेस से सभी स्तंभ मानों को पुनर्प्राप्त करता है, और अनुप्रयोग पक्ष पर अधिकतम लागू होता है।
सुपरडुक

1
यह 3 उप-प्रश्न बनाता है। मैंने एक अलग उत्तर प्रस्तावित किया।
jsgoupil

3
बस एक साइड नोट - यह EF कोर के साथ काम नहीं करता है। मैंने इस्तेमाल किया:await _context.Persons.MaxAsync(x => (int?)x.Age) ?? 0
उदाहरणार्थ

11

या आप यह कोशिश कर सकते हैं:

(From p In context.Persons Select p Order By age Descending).FirstOrDefault

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;

आपका कॉलम गैर-अशक्त है

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]

1
के बारे में क्याint maxAge = context.Persons.Max(x => (int?)x.Age) ?? 0;
egmfrs

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()

आपका दूसरा उत्तर मुझे अच्छा लग रहा है, अगर कोई जनरेटेड SQL को देखता है, तो दूसरा उत्तर अच्छा है।
दीपक शर्मा


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

यह संस्करण, यदि सूची खाली है :

  • रिटर्न null - अशक्त अधिभार के लिए
  • थ्रो Sequence contains no elementअपवाद - गैर-अशक्त अधिभार के लिए

-

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

यह संस्करण रिक्त सूची के मामले को संभालता है, लेकिन यह अधिक जटिल क्वेरी उत्पन्न करता है, और किसी कारण से ईएफ कोर के साथ काम नहीं करता है।

-

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

यह संस्करण सुरुचिपूर्ण और प्रदर्शनशील है (सरल क्वेरी और डेटाबेस के लिए एकल राउंड ट्रिप), ईएफ कोर के साथ काम करता है। यह गैर-अशक्त प्रकार को अशक्त करने और फिर ??ऑपरेटर का उपयोग करके डिफ़ॉल्ट मान को लागू करके ऊपर उल्लिखित अपवाद को संभालता है ।


1

चयनित जवाब अपवादों को फेंकता है, और कार्लोस टोलेडो का जवाब डेटाबेस से सभी मूल्यों को प्राप्त करने के बाद फ़िल्टरिंग लागू होता है।

निम्नलिखित एक एकल दौर यात्रा चलाता है और एक अपवाद के बिना किसी भी संभव अनुक्रमित का उपयोग करते हुए, एक ही मूल्य पढ़ता है।

int maxAge = _dbContext.Persons
  .OrderByDescending(p => p.Age)
  .Select(p => p.Age)
  .FirstOrDefault();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.