Laden...

LinQ - WHERE Klausel gibt Fehler aus!?

Erstellt von knoden vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.965 Views
K
knoden Themenstarter:in
12 Beiträge seit 2012
vor 11 Jahren
LinQ - WHERE Klausel gibt Fehler aus!?

Hallo Leute,

meine Klasse, die meine Datenbanktabelle repräsentiert:

[Table(Name = "Times")]
    public class Time
    {
        [Column(IsPrimaryKey = true, IsDbGenerated = true)]
        public Int64 time_id;

        [Column]
        public string time_fk_personal_id { get; set; }

        [Column]
        public string time_fk_project_id { get; set; }

        [Column]
        public Int64 time_day { get; set; }

        [Column]
        public decimal time_hours { get; set; }
    }  

Meine Funktion, mit der ich das Feld "time_hours" ändern will:

Table<Time> ChangeTimes = db.GetTable<Time>();

            var changeDay = from d in ChangeTimes
                            where d.time_day.Date() == txtChangeDay.Text && d.time_fk_personal_id == txtChangeEmployeeId.Text
                            select d;

            Time day = changeDay.First<Time>();
            day.time_hours = Convert.ToDecimal(txtChangeHoursNew.Text);
            db.SubmitChanges();

Die funktion .Date() gibt einen ShortDateString von time_day zurück, der ein Unix Timestamp ist.

public static string Date(this Int64 UnixTimestamp)
        {
            DateTime dateTime = new DateTime(1970, 1, 1);
            dateTime = dateTime.AddMilliseconds(Convert.ToDouble(UnixTimestamp)).AddHours(2);
            return dateTime.ToShortDateString();
        }

Führe ich das Programm aus, und vergleiche, ob der Rückgabewert meiner .Date() Funktion gleich ist mit dem Datum, das ich in ein Textfeld eingegeben habe, meldet der Debugger folgenden Fehler:

Fehlermeldung:
NotSupportedException -- Für die System.String Date(Int64)-Methode gibt es keine unterstützte Übersetzung in SQL.

Erklären kann ich mir die Meldung nicht, auch im Netz habe ich nichts Hilfreiches gefunden, außer eine Aussage, dass viele Methoden von SQL nicht Supportet werden... Wie ich es aber schaffe, dass ich die WHERE Klausel trotzdem so schreiben kann, habe ich nicht gefunden.

Gruß
Knoden

W
59 Beiträge seit 2006
vor 11 Jahren

Ich denke mal du arbeitest mit Linq To SQL (oder ähnlichem).

Queries dieser Art werden nicht im Code ausgeführt sondern am Server. Da dieser aber nur SQL versteht, muss die ganze Abfrage erst in einen SQL-String umgewandelt werden. Diese Umwandlungen müssen aber Fall für Fall von dem. Linq To SQL Provider implementiert werden - und deine _neue _Date-Funktion ist dem Linq To SQL Provider unbekannt - deshalb der Fehler.

Ich würde dir folgendes vorschlagen:
Nachdem time_day offensichtlich ein Int64 ist und der Linq To SQL Provider das umwandeln kann, versuche einfach den Text im Textfeld in einen Int64 zu **parsen **und ihn der Query als Wert zuzuführen.

long usertime = 0;
if(Int64.TryParse(txtChangeDay.Text, out usertime) == true)  // gültiger Wert?
{
Table<Time> ChangeTimes = db.GetTable<Time>();
 var changeDay = from d in ChangeTimes
                            where d.time_day == usertime && d.time_fk_personal_id == txtChangeEmployeeId.Text
                            select d;

Time day = changeDay.First<Time>();
            day.time_hours = Convert.ToDecimal(txtChangeHoursNew.Text);
            db.SubmitChanges();
}

Lg warappa

Praxis schlägt immer die Theorie!

K
knoden Themenstarter:in
12 Beiträge seit 2012
vor 11 Jahren

Hi Warappa,

danke für die Idee, aber das wird nicht funktionieren...
In txtChangeDay.Text stehen Formate wie "08.10.2012" oder "01.05.2011" drin... Ich will nach dem Datum vergleichen. In der DB steht aber nur ein Timestamp, den ich zum vergleichen in einen ShortDateString umwandeln möchte, dass ich ein passendes ergebnis bekomme... So meine Theorie..

Mit den Punkten in der Eingabe kann ich, logischerweise, nicht in einen Int64 parsen...

Als andere Option hätte ich die Möglichkeit, den Timestamp gleich als DateTime in die DB zu speichern... Allerdings bräuchte ich dann immer die Stunde 0 von dem jeweiligen Tag...
Also bsp. 08.10.2012 00:00:00... Dann könnte ich in C# auch ein DateTime Objekt mit dem DateTime aus der SQL Datenbank vergleichen...

Wenn ich bei DateTime(1970, 1, 1) meine Millisekunden addiere komm ich immer auf ca. 6 Uhr morgens... Um die Zeit wurde immer ein Timestamp aufgezeichnet...

Wie kann ich am einfachsten meine DateTime Objekte auf den selben tag, aber die Stunden 0 zurücksetzen?
Tut zwar grad nicht zum Thema, aber wäre auch ein Möglichkeit...

Gruß
Knoden

2.891 Beiträge seit 2004
vor 11 Jahren

Wie kann ich am einfachsten meine DateTime Objekte auf den selben tag, aber die Stunden 0 zurücksetzen?

Indem du einfach die DateTime.Date-Eigenschaft verwendest.

Wenn das nicht hilft, musst du in die Erstellung der Ausdrucksbaumstruktur für den LINQ-Provider eingreifen. Z.B. mittels LINQKit (siehe auch Berechnete Properties im EntityFramework).