2017-08-23 2 views
1

Ich habe eine Tabelle mit 3 Spalten, ID, Name und Geburtstag
die Datumsspalte der Datenbank in C# mit Linq Filter

Id | Name | Birthday 
-- | ---- | ----------- 
1 | John | 1993/07/12 
2 | Sarah| 1995/02/05 
3 | Jack | 1990/10/01 

Jetzt geht i Person in DataGridView zeigen, dass ihre Birthday dann 1994 Lower ist/20.05
ich LINQ mit Query

+0

Haben Sie selbst etwas versucht? –

+0

Bitte teilen Sie mir den Code, den Sie geschrieben haben? –

Antwort

1

geht mit der Annahme zu schaffen, das zum Geburtstag ist immer in ein YYYY/MM/DD-Format, dann:

Persons.Where(p=>p.Birthday<"1994/05/20"); 

Aber das funktioniert nur, weil Daten in YYYY/MM/DD sortierbar sind, also müssen Sie sie nicht zu einem echten Datum/Datetime-Objekt analysieren und vergleichen, da die Zeichenfolge tatsächlich noch funktioniert.

Wenn die LINQ-Provider Sie verwenden nicht unterstützt String < vergleicht verwenden, dann können Sie diese stattdessen tun:

Persons.Where(p=>p.Birthday.CompareTo("1994/05/20") < 0); 
+0

Stimmt, aber leider gibt es keinen '<' Operator für 'string'. –

+0

@IvanStoev Danke, ich vergesse immer die meisten nicht, also habe ich einen Workaround hinzugefügt. –

+0

Ich meinte C# :) Wie auch immer. –

2

Ihre Birthday Spalte Unter der Annahme, ist vom Typ Date

DateTime dt=DateTime.ParseExact("1994/05/20", "yyyy/MM/dd", CultureInfo.InvariantCulture); 
var result = from t in context.table 
       where t.Birthday < dt 
       select t; 

EDIT

Wenn seine vom Typ String, müssen Sie Datumsformat konvertieren und wie oben

var result = from t in context.table 
        where DateTime.Parse(t.Birthday,"yyyy/MM/dd",CultureInfo.InvariantCulture) < dt 
        select t; 
+1

Dies funktioniert nicht, da Birthday nText ist. –

+1

Die Frage lautet 'Der Typ der Geburtstagssäule ist nText nicht Datum' –

+0

Was ist der Sinn von ** etwas ** anzunehmen, was OP klar gesagt hat, ist nicht ihr Fall? –

1

Der größte Teil der Antwort vergleichen Spalte geschrieben hier annehmen Geburtstag als Datum-.

Zuerst werden wir-Parse-Text Datetime und dann unter

wie gezeigt, dass dies vergleichen Versuchen:

DateTime dt = new DateTime("1994/20/05"); 

var result = EmployeeDetails.Where(a => DateTime.ParseExact(a.Birthday ,"yyyy/dd/mm",CultureInfo.InvariantCulture) < dt).ToList(); 
+0

Danke für Ihre Antwort, geben Sie mir diesen Fehler, der Name 'CultureInfo' existiert nicht im aktuellen Kontext? – Damon

+0

Verwenden Sie System.Globalization. Es ist gut, CultureInfo zu verwenden, da Ihre Anwendung die Bereitstellung verschiedener Kultureinstellungen haben kann. – jANVI

+0

kann jetzt sein, Sie können es upvote und akzeptieren als Antwort – jANVI

1

Wenn Sie Daten verwenden selbst einen Gefallen tun und verwenden Sie einen strongly typed Felder, es wird Ihnen viele "Kopfschmerzen" in der Zukunft ersparen.

In dem Beispiel können Sie sehen, dass ein neues stark typisiertes DataColumn-Feld deklariert wird und alle Zeichenfolgen, die Datumsangaben enthalten, in ein "echtes" Datum konvertiert werden. Verwenden Sie dann LINQ, um Ihre Ergebnisse sicher in eine neue Datenstruktur zu filtern (im Beispiel wähle ich DataTable).

private void Funky() 
{ 
    DataColumn RealDate = new DataColumn("RealDate"); 
    RealDate.DataType = System.Type.GetType("System.DateTime"); 
    dt.Columns.Add(RealDate); 

    // strongly type a DateTime Column it will save you alot of problems in the future 
    for (int i = 0; i < dt.Rows.Count; i++) 
    { 
     string[] temp = dt.Rows[i]["BirthDay"].ToString().Split('/'); 
     dt.Rows[i]["RealDate"] = new DateTime(int.Parse(temp[0]), int.Parse(temp[1]), int.Parse(temp[2])); 
    } 

    // finaly get you result 
    var targetDate = new DateTime(20, 5, 1994); 

    DataTable FilterDt = dt.AsEnumerable().Where(x => x.Field<DateTime>("RealDate") < targetDate).Select(y => y).CopyToDataTable(); 
    dataGridView1.DataSource = FilterDt; 
} 
+0

Was ist 'dt' und' RealDate'? – Damon

Verwandte Themen