Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - IQueryable<int?> in IQueryable <int> umwandeln


Habak - Di 29.11.11 22:30
Titel: IQueryable<int?> in IQueryable <int> umwandeln
Einen guten Abend allerseits,

trotz Google-Suche und C#-Kompendium komme ich nicht weiter.
Mein Anliegen:

In einer Tabelle namens "zuordnung_merkmale" sind Felder mit unterschiedlichen Datentypen int, char, etc. enthalten.
Erstelle ich nun eine Abfrage wie beispielsweise:


C#-Quelltext
1:
2:
3:
4:
Daten_neuDataContext ddcn = new Daten_neuDataContext();
var nummer = from daten in ddcn.zuordnung_merkmale
                              where (daten.merkmal_name == "glatt" && daten.merkmal_ebene == 2 )
                              select daten.hk_nummer;


ist das Ergebnis ein IQueryable<int?>, obwohl die "hk_nummer" in der Tabelle als (int) hinterlegt ist.

Wie schafft man es, dass das Ergebnis ein IQueryable<int> wird?

Hintergrund meiner Frage ist, das ich aus zwei verschiedenen Tabellen jeweils Merkmal-Nummern ermittele und mittels der Except-Methode die "ungleichen" weiterverwenden möchte:


C#-Quelltext
1:
2:
3:
var merkmale_1 = (from aus1 in datacont.zuordnung_merkmale
...
select new { aus1.merkmal_nummer});


und


C#-Quelltext
1:
2:
3:
var merkmale_2 = (from aus2 in datacont.merkmale
...
select new { aus2.merkmal_nummer}).Except(merkmale_1);


was leider nur funktioniert, wenn die Tabelle "merkmale" sowie die Tabelle "zuordnung_merkmale" einheitlich aus (int)-Spalten besteht.
Sobald in einer der beiden Tabellen ein "char"- oder "varchar"-Feld enthalten ist, klappt das ganze nicht mehr.

Ich hoffe, das Problem halbwegs verständlich erläutert zu haben.

Für Hinweise oder gar Lösungen bedanke ich mich schon im voraus.

Vielen Dank.

Habak

Moderiert von user profile iconTh69: Beitragsformatierung überarbeitet: HTML-Tags korrigiert


Trashkid2000 - Mi 30.11.11 08:24

Hallo Habak,

naja, wenn hk_nummer ein int? ist, deutet es erstmal darauf hin, dass es im Modell (Entity Framework?) als nullable deklariert wurde. Und dementsprechend wahrscheinlich auch in der Datenbank.
Soll das so sein?
Ansonsten: Ich denke zu wissen, dass wenn Du ein Select auf ein IQueryable machst, dass da nicht mehr wirklich ein IQueryable rauskommt. Soll heißen, dass erst die Daten vom Server geholt werden, und dann die Projizierung duchgeführt wird.

C#-Quelltext
1:
2:
3:
4:
5:
6:
List<int?> values = new List<int?>() 
{
   1null23
};
IQueryable<int?> query1 = values.AsQueryable();
IEnumerable<int> query2 = values.Where(x => x.HasValue).Select(x => x.Value);

LG


Habak - Mi 30.11.11 14:51

Hallo Trashkid2000,

vielen Dank für den Tipp. Manchmal ist man einfach nur blind. Tatsächlich war in der Datenbank für 2 Felder auch Null zugelassen.
Nach der Änderung funktioniert alles tadellos.
Nochmals Danke für Deine Hilfe.

Viele Grüße

Habak