Hallo!
Ich möchte DBNull-Werte einer Spalte einer DataTable bei der Instanzierung eines Typ's abfangen.
Ich habe eine DataTable: TabBatchImportDefinitionen, dessen Zeilen ich über eine Linq-Abfrage iteriere und dabei neue Instanzen des Typs: BatchImportDefinition erstelle um eine "Liste" (IEnumerable<T>) der Werte der DataTable zu erstellen:
IEnumerable<BatchImportDefinition> ietab =
TabBatchImportDefinitionen.AsEnumerable().Select(row =>
{
return new BatchImportDefinition
{
Bezeichnung = (string)row["BEZEICHNUNG"],
Dokumententyp = (string)row["DOK_TYP"],
ENCODING_TEXT = (if (Convert.IsDBNull(row["ENCODING_TEXT"])) 0 // DB-NULL Werte abfangen
else Convert.ToInt32(row["ENCODING_TEXT"], App.GebietsSchema))
};
});
Da eine Spalte (ENCODING_TEXT) auch DBNull-Werte enthalten kann, möchte ich sie bei der Instanzierung des Typ's (BatchImportDefinition) abfangen.
Eine if-Abfrage innerhalb der Instanzierung ist aber nicht gültig.
Welche Möglichkeit gibt es denn dies zu realisieren?
Du befindest Dich in seinem Delegate Scope. Schreibs also in die Expression.
TabBatchImportDefinitionen.AsEnumerable().Select(row =>
{
var abcValue = isnullAbfrageHier ? abc : xyz;
return new BatchImportDefinition
{
Bezeichnung = (string)row["BEZEICHNUNG"],
Dokumententyp = (string)row["DOK_TYP"],
ENCODING_TEXT = abcValue
};
});
Hier im Editor geschrieben, daher stark vereinfacht.
Wenn das als Expression kompiliert werden sollte, musst Du ne Expression Func draus machen.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo Abt!
Ich liebe deine fachgerechten Antworten!!!
Natürlich hat es so funktioniert!
TabBatchImportDefinitionen.AsEnumerable().Select(row =>
{
int eNCODING_TEXT = Convert.IsDBNull(row["ENCODING_TEXT"]) ? 0 : Convert.ToInt32(row["ENCODING_TEXT"], App.GebietsSchema); // DB-NULL Werte abfangen
return new BatchImportDefinition
{
Bezeichnung = (string)row["BEZEICHNUNG"],
...
ENCODING_TEXT = eNCODING_TEXT
};
});
Ich war zu sehr darauf fixiert, die DBNull-Abfrage bei der Initalisierung zu implementieren. Das row-Objekt habe ich ja schon vorher!!!
Vielen DANK! für deine schnelle Hilfe!
Den trinären Operator ?:
kann man auch direkt bei der Zuweisung benutzen:
TabBatchImportDefinitionen.AsEnumerable().Select(row =>
{
return new BatchImportDefinition
{
Bezeichnung = (string)row["BEZEICHNUNG"],
...
ENCODING_TEXT = Convert.IsDBNull(row["ENCODING_TEXT"]) ? 0 : Convert.ToInt32(row["ENCODING_TEXT"], App.GebietsSchema) // DB-NULL Werte abfangen
};
});
Persönlich hätte ich dann nur row["ENCODING_TEXT"]
als Variable benutzt, damit es nur einmalig berechnet wird:
TabBatchImportDefinitionen.AsEnumerable().Select(row =>
{
var encodingText = row["ENCODING_TEXT"];
return new BatchImportDefinition
{
Bezeichnung = (string)row["BEZEICHNUNG"],
...
ENCODING_TEXT = Convert.IsDBNull(encodingText) ? 0 : Convert.ToInt32(encodingText, App.GebietsSchema) // DB-NULL Werte abfangen
};
});
Eigenartig finde ich nur, daß die Encoding-Spalte als Text (string
) in der DataTable
definiert ist (wenn du diese dann doch als Zahl interpretierst). Oder können dort auch Encodings wie UTF8
, UTF16
stehen? Dann würdest du aber eine Exception erhalten...
Und auch die Angabe eines lokalisierten IFormatProviders
bei so einer Spalte ist sehr eigenartig. Wäre CultureInfo.InvariantCulture
dort nicht sinnvoller?