सी # लाइनक जहां दिनांक 2 तिथियों के बीच है


81

मैं दो तारीखों के बीच मुझे सभी रिकॉर्ड प्राप्त करने के लिए अपना लाइनक स्टेटमेंट प्राप्त करने की कोशिश कर रहा हूं, और मुझे यह सुनिश्चित करने के लिए बहुत ज़रूरी नहीं है कि मुझे काम करने के लिए क्या बदलना होगा: (a.Start >= startDate && endDate)

var appointmentNoShow =
    from a in appointments
    from p in properties
    from c in clients
    where a.Id == p.OID && (a.Start.Date >= startDate.Date && endDate)

जवाबों:


148

बस इसे बदल दो

var appointmentNoShow = from a in appointments
                        from p in properties
                        from c in clients
                        where a.Id == p.OID && 
                       (a.Start.Date >= startDate.Date && a.Start.Date <= endDate)

4
Hi @Giorgi: निर्दिष्ट प्रकार के सदस्य 'तिथि' LINQ से संस्थाओं में समर्थित नहीं है।
पीसइंडम

2
नमस्ते @ इसके लिए समाधान तालिका के गुणों में फ़ंक्शन दिनांक निर्दिष्ट नहीं करता है। उदाहरण के लिए: db.Invoices.Where (w => w.Date> = Date1.Date && w.Date <= Date2.Date) .ToList ()। यह काम करेगा;)
JD - DC TECH

@ user1502624 जो EF मेनलाइन में काम नहीं करता है और मैंने उसके लिए सोर्स कोड देखा है। मैंने एक शाखा बनाई है जो काम करती है। यह .Dateकॉल को कॉल में परिवर्तित करके काम करता है EntityFunctions.TruncateDate
एरॉन

यह क्वेरी नियुक्तियों को छोड़ देगी जो प्रारंभ तिथि से पहले शुरू होती है और समाप्ति तिथि के बाद समाप्त होती है; बहु-दिन की नियुक्तियों को शामिल किया जाना चाहिए। यदि आपको ऐसी क्वेरी की आवश्यकता है जिसमें ऐसी संभावनाएँ शामिल हैं, तो "दूसरी क्वेरी" पर एक नज़र डालें यहाँ stackoverflow.com/a/7815706/4040647 @Enigmativity
Mark Sizer


6
var QueryNew = _context.Appointments.Include(x => x.Employee).Include(x => x.city).Where(x => x.CreatedOn >= FromDate).Where(x => x.CreatedOn <= ToDate).Where(x => x.IsActive == true).ToList();

1

 public List<tbltask> gettaskssdata(int? c, int? userid, string a, string StartDate, string EndDate, int? ProjectID, int? statusid)
        {
            List<tbltask> tbtask = new List<tbltask>();
            DateTime sdate = (StartDate != "") ? Convert.ToDateTime(StartDate).Date : new DateTime();
            DateTime edate = (EndDate != "") ? Convert.ToDateTime(EndDate).Date : new DateTime();
            tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).
                Where(x => x.tblproject.company_id == c
                    && (ProjectID == 0 || ProjectID == x.tblproject.ProjectId)
                    && (statusid == 0 || statusid == x.tblstatu.StatusId)
                    && (a == "" || (x.TaskName.Contains(a) || x.tbUser.User_name.Contains(a)))
                    && ((StartDate == "" && EndDate == "") || ((x.StartDate >= sdate && x.EndDate <= edate)))).ToList();



            return tbtask;


        }

खोज रिकॉर्ड के आधार पर और आरंभ से लेकर अंतिम तिथि तक खोज रिकॉर्ड के लिए यह मेरी क्वेरी है


1

यदि कोई व्यक्ति यह जानना चाहता है कि 2 सूची के साथ और तिथियों के बीच कैसे काम करना है

var newList = firstList.Where(s => secondList.Any(secL => s.Start > secL.RangeFrom && s.End < secL.RangeTo))

1

यदि आपके पास दिनांक अंतराल फ़िल्टर स्थिति है और आपको उन सभी रिकॉर्डों का चयन करने की आवश्यकता है जो आंशिक रूप से इस फ़िल्टर श्रेणी में आते हैं। अनुमान: रिकॉर्ड्स में ValidFrom और ValidTo प्रॉपर्टी है।

DateTime intervalDateFrom = new DateTime(1990, 01, 01);
DateTime intervalDateTo = new DateTime(2000, 01, 01);

var itemsFiltered = allItems.Where(x=> 
    (x.ValidFrom >= intervalDateFrom && x.ValidFrom <= intervalDateTo) ||
    (x.ValidTo >= intervalDateFrom && x.ValidTo <= intervalDateTo) ||
    (intervalDateFrom >= x.ValidFrom && intervalDateFrom <= x.ValidTo) ||
    (intervalDateTo >= x.ValidFrom && intervalDateTo <= x.ValidTo)
);

0

इसलिए आप नीचे स्क्रॉल कर रहे हैं क्योंकि उत्तर काम नहीं करते हैं:

यह जादू की तरह काम करता है (लेकिन वे कहते हैं कि इसमें बड़े डेटा के लिए दक्षता के मुद्दे हैं, और आप मेरी तरह परवाह नहीं करते हैं)

1- डेटाबेस में डेटा टाइप मेरे मामले में "डेटटाइम" और "अशक्त" है।

DB में उदाहरण डेटा प्रारूप इस प्रकार है:

2018-11-06 15:33:43.640

C # में जब स्ट्रिंग में परिवर्तित किया जाता है जैसे:

2019-01-03 4:45:16 PM

तो प्रारूप है:

yyyy/MM/dd hh:mm:ss tt

2- इसलिए आपको पहले उचित प्रारूप में अपने डेटाटाइम चर तैयार करने की आवश्यकता है:

उदाहरण 1

yourDate.ToString("yyyy/MM/dd hh:mm:ss tt")

उदाहरण 2 - पिछले 30 दिनों के लिए डेटाटाइम रेंज

    DateTime dateStart = DateTime.Now.AddDays(-30);
    DateTime dateEnd = DateTime.Now.AddDays(1).AddTicks(-1);

3- आखिर में आप जिस दिन को खोजने की कोशिश कर रहे हैं, उसे खो देने के लिए आपके द्वारा खोई गई लाइनक क्वेरी (EF 6 की आवश्यकता है)

using System.Data.Entity;

_dbContext.Shipments.Where(s => (DbFunctions.TruncateTime(s.Created_at.Value) >= dateStart && DbFunctions.TruncateTime(s.Created_at.Value) <= dateEnd)).Count();

खाते की तुलना में समय लेने के लिए:

(DbFunctions.CreateDateTime(s.Created_at.Value.Year, s.Created_at.Value.Month, s.Created_at.Value.Day, s.Created_at.Value.Hour, s.Created_at.Value.Minute, s.Created_at.Value.Second) >= dateStart && DbFunctions.CreateDateTime(s.Created_at.Value.Year, s.Created_at.Value.Month, s.Created_at.Value.Day, s.Created_at.Value.Hour, s.Created_at.Value.Minute, s.Created_at.Value.Second) <= dateEnd)

अन्य स्टैकओवरफ़्लो प्रश्नों और उत्तरों पर उल्लिखित निम्न विधि सही ढंग से काम नहीं करेगी:

....
&&
(
    s.Created_at.Value.Day >= dateStart.Day && s.Created_at.Value.Day <= dateEnd.Day &&
    s.Created_at.Value.Month >= dateStart.Month && s.Created_at.Value.Month <= dateEnd.Month &&
    s.Created_at.Value.Year >= dateStart.Year && s.Created_at.Value.Year <= dateEnd.Year
)).count();

यदि उदाहरण के लिए प्रारंभ का दिन इस महीने में था और अंत का दिन अगले महीने का है, तो क्वेरी गलत आएगी और कोई परिणाम नहीं मिलेगा, उदाहरण के लिए:

DatabaseCreatedAtItemThatWeWant = 2018/12/05

startDate = 2018/12/01

EndDate = 2019/01/04

क्वेरी हमेशा "महीना" को ध्यान में रखे बिना 01 से 04 के बीच के दिनों की खोज करेगी, इसलिए "s.Created_at.Value.Day <= dateEnd.Day" विफल हो जाएगा

और अगर आपके पास वास्तव में बड़ा डेटा है तो आप linq के बजाय Native SQL Query को निष्पादित करेंगे

...
    ... where Shipments.Created_at BETWEEN CAST(@Created_at_from as datetime) AND CAST(@Created_at_to as datetime))
    ....

धन्यवाद


फिर भी तारीखों की श्रेणी में वापस सही आइटम नहीं मिल रहे हैं।
एडम री

0

मुझे यह काम करने में समस्या हो रही थी।

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

यह मेरा समाधान है:

        var yesterday = DateTime.Today.AddDays(-1);
        var today = DateTime.Today;
        var tomorrow = DateTime.Today.AddDays(1);            
        var vm = new Model()
        {
            Yesterday = _context.Table.Where(x => x.From <= yesterday && x.To >= yesterday).ToList(),
            Today = _context.Table.Where(x => x.From <= today & x.To >= today).ToList(),
            Tomorrow = _context.Table.Where(x => x.From <= tomorrow & x.To >= tomorrow).ToList()
        };
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.