Hallo zusammen,
ich versuche seit einigen Tagen ein altes stück Software in eine WPF-MVVM Applikation einfliesen zu lassen. Um die ganzen Views zu füttern benötige ich einige Models die ihre Daten aus einer Datenbank beziehen.
Ich möchte nun vermeiden für jedes Model eine eigene Abfrage zu generieren aber auch mir große Mengen an Daten aus der Datenbank zu ziehen und diese in das benötigte Format zu überführen.
Ich dachte da an generische Methoden bin aber in dem Thema nicht so bewandert, meine aktuelle Bemühung sieht so aus:
public static List<TModel> GetValuesByColumn<TModel>(string TabellenName, string SpaltenName, int ID) where TModel : class
{
SqlCeConnection conn = null;
var liste = new List<TModel>();
try
{
conn = new SqlCeConnection("Data Source = " + Properties.Settings.Default.DatenbankPfad);
conn.Open();
SqlCeCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM " + TabellenName + " WHERE " + SpaltenName + "=" + ID;
SqlCeDataReader reader = cmd.ExecuteReader(CommandBehavior.Default);
if(typeof(TModel) == typeof(Model.Project))
{
while(reader.Read())
{
var data = new Model.Project();
data.ID = int.Parse(reader["id"].ToString());
data.Pfad = (string)reader["pfad"];
data.Name = (string)reader["name"];
liste.Add(data);
}
return liste;
}
}
catch
{ }
finally
{
conn.Close();
}
}
Leider meckert der Compiler immer am Rückgabe Datentyp rum, "liste.add(data)" bringt als Fehlermeldung > Fehlermeldung:
Die beste Übereinstimmung für die überladene System.Collections.Generic.List<TModel>.Add(TModel)-Methode hat einige ungültige Argumente.
Ich bin hier mit meinem latein am ende. Kann mir jemand ein Tip geben oder zumindest ein paar Denkanstöße in die richtige Richtung?
Hallo DuRom,
Model.Project muss TModel implementieren.
Grüße
spooky
Hi Spooky,
sorry das meine Antwort so lange dauert. Bin nicht dazu gekommen weiter zu machen.
public class Project
{
//...
}
public class Project<TModel> where TModel : class
{
//...
}
Hast du das gemeint Spook?
ich hab das ganze nun so gelöst:
public static List<TModel> GetValuesByColumn<TModel>(string TabellenName, string SpaltenName, int ID) where TModel : Model.Project
{
.
.
liste.Add((TModel)data);
.
}
Also die Hauptänderung besteht darin das ich nun "conrete typ" bei der Methode angebe und so den Rückgabetyp definieren kann.
Nur so als frage, du weist schon das es ORMapper gibt, die dir das alles schon abnehmen?