Autor Beitrag
Habak
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Di 29.11.11 22:30 
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:

ausblenden 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:

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


und

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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.
ausblenden 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

Für diesen Beitrag haben gedankt: Habak
Habak Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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