2013-02-14 17 views
5

प्राप्त करने के लिए जन्मतिथि पर LINQ क्वेरी, मैं कर्मचारी जन्म तिथि पर एक प्रश्न (उत्तरविंड डीबी में) चला रहा हूं और मैं उनकी उम्र प्राप्त करना चाहता हूं। मैं उसको कैसे करू?आयु

private void Form1_Load(object sender, EventArgs e) 
    { 
     using (NorthWindDataContext dataContext = new NorthWindDataContext()) 
     { 
      DateTime today = DateTime.Today; 

      var q1 = from z in dataContext.Employees 
        select new 
        { 
         z.FirstName, 
         today-z.BirthDate <---- problem here 
        }; 

      dataGridView1.DataSource = q1; 

     } 
    } 

मेरी अंतिम ग्रिड में मैं उम्र के कॉलम चाहता हूं।

जन्मतिथि = 29/05/1969 (उदाहरण)

+0

समस्या क्या है:

मामले आप रुचि रखते हैं में, यह निम्नलिखित एसक्यूएल का उत्पादन करेगा? – V4Vendetta

उत्तर

9

यह मुश्किल हो सकता है क्योंकि आप वाकई जन्मदिन इस साल बीत चुका है बनाने की जरूरत है, नहीं तो तुम्हारी उम्र एक करके बाहर हो जाएगा।

var query = from e in dataContext.Employees 
      //get the difference in years since the birthdate 
      let years = DateTime.Now.Year - e.BirthDate.Year 
      //get the date of the birthday this year 
      let birthdayThisYear = e.BirthDate.AddYears(years) 
      select new 
      { 
       //if the birthday hasn't passed yet this year we need years - 1 
       Age = birthdayThisYear > DateTime.Now ? years - 1 : years 
      }; 

ऐसा करने से जेनरेट की गई SQL क्वेरी में आयु की गणना करने का लाभ होता है। इसका मतलब है कि आपको उम्र की गणना करने के लिए ग्राहक पक्ष पर परिणाम सेट के माध्यम से पुन: प्रयास करने की आवश्यकता नहीं है।

-- Region Parameters 
DECLARE @p0 Int = 2013 
DECLARE @p1 DateTime = '2013-02-14 09:08:46.413' 
DECLARE @p2 Int = 1 
-- EndRegion 
SELECT [t2].[value] AS [years], [t2].[value2] AS [birthdayThisYear], 
    (CASE 
     WHEN [t2].[value2] > @p1 THEN [t2].[value] - @p2 
     ELSE [t2].[value] 
    END) AS [Age] 
FROM (
    SELECT [t1].[value], DATEADD(YEAR, [t1].[value], [t1].[BirthDate]) AS [value2] 
    FROM (
     SELECT [t0].[BirthDate], @p0 - DATEPART(Year, [t0].[BirthDate]) AS [value] 
     FROM [Employees] AS [t0] 
     ) AS [t1] 
    ) AS [t2] 
+0

ग्रेट उत्तर। बस इस कोड में, मेरे कोड में जोड़कर, मैंने डीबीफंक्शन के साथ "e.BirthDate.AddYears (वर्षों)" पंक्ति को प्रतिस्थापित किया। AddYears (e.BirthDate, वर्ष) और सब ठीक हो जाता है –

0
var q1 = from z in dataContext.Employees 
      select new 
     { 
      z.FirstName, 
      z.BirthDate, 
      Age = DateTime.Now.Year - z.BirthDate.Year 
     }; 
+0

यह मैं नहीं था, लेकिन मुझे लगता है कि डाउनवोट इसलिए है क्योंकि यह एक माइनस है, एक हाइफ़न नहीं –

+0

@ डॉक्टरक्टर हाँ - आगे निरीक्षण पर मुझे एहसास हुआ कि उसने आज परिवर्तनीय घोषित किया है। बिट बहुत जल्दी :-) –

6

गुमनाम वस्तु है कि 3 गुण बनाएँ: FirstName, Age और BirthDate (इस चेक के लिए आवश्यक है अगर कर्मचारी जन्मदिन इस साल नहीं बीत चुका है या) ।

var q1 = (from z in dataContext.Employees 
    select new 
    { 
     FirstName = z.FirstName, 
     Age = today.Year - z.BirthDate.Year, 
     BirthDate = z.BirthDate 
    }).ToList(); 

q1.ForEach(x => if (x.BirthDate > today.AddYears(-x.Age)) { x.Age--; }); 

टिप्पणियां (है कि सही कर रहे हैं) आप भी अगर BirthDate या बीत चुका है, इसलिए डेटा चयन करने के बाद आपको लगता है कि के लिए जाँच को चलाने के लिए है की जाँच करनी चाहिए के अनुसार।

+0

किसी व्यक्ति के जन्मदिन से पहले और बाद में यह परिवर्तन कैसे होगा? – bendataclear

+1

अगर इस साल जन्मदिन अभी तक पारित नहीं हुआ है तो यह काम नहीं करेगा। यह उस उम्र की रिपोर्ट करेगा जो उस स्थिति में एक वर्ष बहुत अधिक है। –

+0

इस बात की वजह से ग्राहक की ओर से उम्र को कम करने की आवश्यकता है। एसक्यूएल में उम्र की गणना करने वाले समाधान के लिए मेरा उत्तर देखें। –

1

आप एक नामित संपत्ति, कुछ इस तरह की जरूरत है:

private void Form1_Load(object sender, EventArgs e) 
{ 
    using (NorthWindDataContext dataContext = new NorthWindDataContext()) 
    { 
     DateTime today = DateTime.Today; 

     var q1 = from z in dataContext.Employees 
       select new 
       { 
        Name = z.FirstName, 
        Age = today - z.BirthDate 
       }; 

     dataGridView1.DataSource = q1; 

    } 
} 
1
var temp = from o in dataContext.Employees 
    select new 
    { 
     FirstName = o.FirstName, 
     Age = DateTime.Now.Year - z.BirthDate.Year -1 
    }; 
संबंधित मुद्दे