Überraschende InvalidOperationException im XmlSerializer ab .Net 4.0 29.06.2010

Sven Erik Matzen
Sven Erik Matzen, Chief eXpert

Es gibt eine kleine Änderung im XmlSerializer seit der Version 4.0 des .Net Frameworks. MSDN erwähnt die Änderung mit dem Satz “In the  the XmlSerializer class no longer serializes objects that are marked as [Obsolete].”. Nicht nur ist die Grammatik des Satzes falsch, auch bedeutet das: Objekte, die mit [Obsolete] gekennzeichnete Properties enthalten, können ggf. nicht mehr korrekt (de)serialisiert werden.

Es bedeutet außerdem: Niemals das Obsolete-Attribut in einer enum verwenden!

Der Grund ist einfach: wenn eine Entität mit dem enum-Wert “a” serialisiert wurde, kann sie nach dem Markieren des Wertes “a” mit dem Obsolete-Attribut nicht mehr gelesen werden. Eine InvalidOperationException wird statt dessen gefeuert.

Diese Änderung bedeutet weiterhin, dass das Obsolete-Attribut nicht mehr länger ein Hinweis an den Programmierer ist, sondern ggf. vorhandene Daten unlesbar machen kann.

Share |

Sie schlafen abends gerne zu Hause in Ihrem eigenen Bett? 25.06.2010

Simone Franz
Simone Franz, Marketing Manager

Sie fühlen Sich in der Microsoft (.NET/BI ) Welt zu Hause?
Sie verlangen Mitsprache bei der Auswahl Ihrer Projekteinsätze?
Sie begeistert es, hochskalierbare BI-Systeme für Enterprise Kunden zu entwickeln?
Sie beherrschen die Optimierung nicht trivialer Datenbanken und Cubes?
Sie verfügen über (erste) Erfahrung mit dem Microsoft BI Stack (SSIS, SSAS; SSRS)?

Ja!
Bewerben Sie sich bei
Svenja.Henss@sdx-ag.de

Weitere Infos zur SDX, den eXperts und den Jobs finden Sie unter www.sdx-ag.de
Hier sehen Sie noch unsere schöne "Print-Stellenanzeige" :-)

Share |

SDX Technical Council: Agiles Projektmanagment mit Scrum 24.06.2010

Simone Franz
Simone Franz, Marketing Manager

Herzlich laden wir zum letzten Technical Council vor der Sommerpause ein:

Thema: ”Agiles Projektmanagement mit Scrum”.
Termin: Mittwoch, 30.06.2010, 17:00 bei SDX
Zielgruppe: Projektleiter, Lead Developer

17:00 Begrüßung mit Fingerfood
17:30-19:30 Agiles PM, Scrum-Einführung, Artefakte, Rollen und Verantwortlichkeiten
19:30 Abendessen mit Bier vom Fass und Wein
 

Organisationen wickeln nicht alle IT-Projekte nach dem gleichen Vorgehensmodell ab. Das Projektmanagement muss also einen Methodenbaukasten bereitstellen, aus dem die Projekte sich bedienen, je nach Anforderungen, Laufzeit, Time-to-Market, Dokumentationsbedarf und gesetzlichen Bestimmungen.

Der SDX eXpert und Scrum Master Rudolf Sauer führt Sie in diesem Council in die Scrum Thematik ein und stellt Ihnen das agile Vorgehensmodell Scrum vor, welches eine flexible Planung und kurzfristige Reaktionsfähigkeit über alle Projektphasen hinweg erlaubt.

Titel

Genießen Sie das abschließende Abendessen und unterhalten Sie sich in lockerer Atmosphäre mit den Teilnehmern und den SDX eXperts.

Das SDX Team freut sich über Ihr Kommen. Auf Wiedersehen im SDX Büro in der Borsigallee (Nähe Hessencenter).

Herzliche Grüße
Simone Franz

Die komplette Einladung bzw. die Teilnahmebedingungen erfahren Sie hier: Einladung zum Technical Council.

Share |

Wird Windows Azure Erfolg haben?

Matthias Jauernig
Matthias Jauernig, Senior eXpert

Hinweis: Dies ist ein ins Deutsche übersetzter Beitrag des Originalartikels auf meinem privaten Blog unter http://www.minddriven.de/index.php/technology/microsoft/cloud-computing/windows-azure/will-windows-azure-succeed.

Auf der PDC 2008 hat sich Ray Ozzie weit aus dem Fenster gelehnt als er sagte, dass Windows Azure die Bühne für Systeme der nächsten 50 Jahre bereiten wird. Jeder (ich eingeschlossen) war sehr aufgeregt und Microsofts Vision und ihre neue Cloud Computing-Plattform inspirierte viele Entwickler.


Windows Azure Es sind nun einige Monate ins Land gegangen. Windows Azure ist kommerziell verfügbar, die Plattform wurde konsolidiert (R.I.P., Live Framework…) und rund um die Welt wurden riesige Datencenter gebaut.
Aber ist Windows Azure tatsächlich diese herausragende Technologie, die Microsoft versprochen hat und auf die sie bauen? Wird Windows Azure (als Produkt) Erfolg haben? Ich bin mir unsicher, aber schauen wir einfach mal…

Ein paar Worte vorab…

SDX Rating Stress SimulatorMeine Gedanken zu dieser Thematik haben einen konkreten Hintergrund. 2009 hat SDX signifikante Forschungsarbeit in die innovativen Bereiche Cloud Computing im Allgemeinen und Windows Azure im Speziellen investiert. Und wir entwickeln uns auf diesem noch immer stark weiter. Im Zusammenhang mit dem NewCloudApp()-Wettbewerb von Microsoft haben wir dabei eine kleine Cloud-Showcase-Anwendung namens Rating Stress Simulator erstellt, die aktuell direkt in der Cloud getestet werden kann.
Von der Architektur her haben wir versucht viele der Möglichkeiten zu nutzen die uns Windows Azure bietet: WebRole, WorkerRole, Message Queue, Table Storage und einen WCF-Service, der in der WebRole gehostet ist.
Wir haben dadurch einige Erfahrungen mit Windows Azure sammeln können, sowohl auf der technischen als auch auf der Business-Seite. Wir finden die Plattform sehr vielversprechend und glauben daran, dass es sich aus technischer Sicht hierbei um die beste Cloud-Plattform auf dem Markt handelt. Sie bietet Entwicklern eine hervorragende Flexibilität, wobei diese immernoch auf ihre vorhandenen technischen Skills z.B. in .NET, Visual Studio und SQL Server zurückgreifen können.

Kosten zählen immer!

Obwohl wir eine großartige Plattform erkennen, sind wir trotzdem unsicher ob Windows Azure erfolgreich sein wird. Der Hauptgrund darin besteht in den fixen Kosten für Leerlauf-Hosting. Darunter verstehen wir die Kosten um die Anwendung allein online zu halten, ohne das auch nur ein Benutzer die Applikation verwendet. Für diese Aufgabe erzeugt unsere kleine Anwendung mit zwei Rollen, einer Message Queue und Table Storage (keine SQL DB eingebunden) monatliche Kosten von über 130€! Der Hauptanteil kommt dabei von den beiden Rollen und ich kann nur sagen: wir sind nicht glücklich mit dieser Situation.
Mit unserer Kritik sind wir dabei nicht allein. Die Kosten von Windows Azure werden aktuell heiß debattiert und das Hosting kleiner Applikationen auf Azure preisgünstiger zu machen ist steht auch an höchster Stelle bei Entwicklern, die auf der My Great Windows Azure Idea-Webseite abgestimmt haben. Verschiedene Blog-Beiträge und Diskussionen gehen in dieselbe Richtung. Als Entwickler realisierten, dass Kosten auf Windows Azure zeitbasiert erhoben werden und nicht abhängig von der tatsächlich benötigten CPU-Zeit verstanden sie sofort, dass ein Hosting auf Windows Azure um ein Vielfaches teurer ist im Vergleich zu anderen Angeboten auf dem Markt.
Stellen wir noch ein anderes Rechenbeispiel für Leerlauf-Kosten an. Stellen wir uns eine kleine Start-Up-Anwendung mit 2 Rollen vor (kleine Instanzen), 1 Web-DB und 1 AppFabric Service Bus-Verbindung, die 24h am Tag auf Windows Azure läuft und auf Benutzer wartet. Dieses Szenario führt zu monatlichen kosten von ca. 137€, was jährliche Kosten von über 1610€ verursacht. Diese Leerlauf-Kosten sind fixe Kosten in diesem Szenario, welche die Einstiegsbarriere angeben welche akzeptiert werden muss, allein um die Anwendung ohne jeglichen Traffic online zu halten. Ist nicht eine der Grundideen des Cloud Computings fixe Kosten niedrig zu halten und in variable Kosten zu verwandeln? Windows Azure folgt diesem Prinzip zumindest nicht auf einem angemessenen Level für kleine Applikationen… Folglich ist es nicht attraktiv für Start-Ups und kleine Firmen die sich für die gleichen (oder geringere) Kosten auch einen Server kaufen können und dabei volle Flexibilität erhalten.

Konkurrenten

Doch was ist eigentlich mit den anderen Anbietern im Cloud Computing-Umfeld und der Attraktivität ihrer Angebote? Starten möchte ich mit Shared Hosting als Möglichkeit Infrastruktur und Applikations-Hosting auszulagern. Shared Hosting ist um ein Vielfaches billiger als Hosting auf Windows Azure. Natürlich offeriert Windows Azure zusätzliche Funktionen wie z.B. Deployment, Management und Skalierbarkeit. Doch der Punkt ist, dass diese Dinge für die wenigsten Entwickler zählen, die sich anfänglich für Windows Azure interessieren. Für die meisten Entwickler, Firmen und deren Applikationen rechtfertigen diese Funktionen in keinster Weise die höheren Kosten des Hostings auf Windows Azure im Vergleich zu Shared Hosting.
Google AppEngine Doch kommen wir einmal zu den “richtigen” Cloud-Anbietern. Google bietet mit seiner AppEngine eine wertvolle Menge an freien Quotas und auch bei der Abrechnung von CPU-Ressourcen sind sie auf dem richtigen Weg. Google berechnet hier nur den Verbrauch von tatsächlicher CPU-Zeit (in Kontrast zu der uhrzeit-basierten Abrechnung von Azure), wodurch kein Leerlauf-Hosting in Rechnung gestellt wird.
Amazon EC2Amazon rechnet mit seinem EC2-Angebot Ressourcen wie auch Windows Azure uhrzeit-basiert ab, bietet Anwendern allerdings die volle Flexibilität um VMs beliebig zu konfigurieren.
Schlussendlich haben wir noch Microsoft mit Windows Azure, welches keine der Vorteile der anderen Angebote mit sich bringt. Auf der einen Seite werden CPU-Ressourcen bei Windows Azure uhrzeit-basiert abgerechnet, wodurch auch die Leerlauf-Zeit von Applikationen in Rechnung gestellt wird. Auf der anderen Seite ist Windows Azure VM-basiert, wobei jede “Role” ein Applikations-Fragment darstellt, welches 1:1 auf eine VM abgebildet wird. Der gravierende Nachteil hierbei ist, dass nur eine einzige Role in einer VM-Instanz enthalten sein kann. Dadurch erhält man nichts von der Flexibilität von Amazons EC2 VMs.
Microsoft sollte auf jeden Fall sein Role/VM-basiertes Skalierungsmodell und/oder die uhrzeit-basierte Abrechnung überdenken. Mit dem derzeitigen Model ist Azure in keinster Weise für Hobby-Entwickler, Start-Ups und kleinere Firmen interessant. die Einstiegshürde ist viel zu hoch und die Skalierbarkeit ist zu eingeschränkt. Warum sollte irgendeine kleinere Firma Windows Azure gegenüber der AppEngine oder EC2 bevorzugen? Ich weiß es nicht…
Doch was sind die Implikationen dieser Unattraktivität für Hobby-Entwickler, Start-Ups und kleine Firmen? Vielleicht können wir ja etwas aus der Vergangenheit ableiten, also gehen wir einmal auf eine kleine Zeitreise zurück in der Geschichte…

Ein kurzer historischer Blick

OS/2 Warp Vor einigen Tagen erzählte mir mein seniorer Kollege Alexander Jung Geschichten vom Aufstieg von Windows und dem Fall von OS/2 Warp (dies war vor meiner aktiven Computerzeit, sodass es sehr interessant war diesen überlieferten Geschichten aus längst vergangenen Zeiten zu lauschen…). Er erzählte mir dass OS/2 im Vergleich zu Windows auf der technischen Seite herausragende Funktionen besaß, doch es konnte den OS-Krieg nicht gewinnen. Es wurde von Windows geschlagen und starb einen langsamen und schmerzhaften Tod…
Ein Grund den er dafür sieht ist die mangelhafte Anziehung von Hobby-Entwicklern und die Unfähigkeit eine größere Entwicklergemeinschaft um OS/2 herum aufzubauen. Windows kam hingegen mit einen günstigen Compiler daher welcher es jedem Entwickler ermöglichte eigene Windows-Software zu entwickeln. Microsoft gelang es Hobby-Entwickler anzuziehen, was in einem großen Software-Pool auf Shareware, Freeware etc. resultierte und zu einer großen Entwicklergemeinschaft inkl. entsprechender Wissensbasis zur Windowsentwicklung führte. OS/2 Warp versagte in diesem Aspekt: der IBM-Compiler war teuer (> 1000 DM) und trotz dass die Plattform und die technischen Features großartig waren konnten aufgrund dieser hohen Einstiegshürde nur wenige Entwickler für dieses System begeistert werden. OS/2 schaffte es nicht eine kritische Masse an Entwicklern zu mobilisieren und damit auch Entwicklerwissen und als Endergebnis Software für die Benutzer zu erzeugen.

Hobby-Entwickler zählen!

Ich komme nicht umhin starke Parallelen zwischen den Strängen von OS/2 und Windows Azure zu sehen, was den Kostenaspekt betrifft. Microsoft sollte es besser wissen! Sie sollten aus der Vergangenheit lernen und von den Fehlern lernen, die andere bereits vor ihnen gemacht haben (erst recht in Hinblick auf den Anspruch, der mit Azure verfolgt wird). Es ist essentiell eine breite Masse von Entwicklern zur Nutzung von Windows Azure zu bewegen und ihnen zu ermöglichen ihre Ideen zu verwirklichen und eine nächste Welle an Killer-Applikationen zu entwickeln. Mit den aktuellen Kosten zieht Microsoft nur sehr wenig Entwickler an, welche Erfahrungen mit der Plattform machen können. Doch das ist ein großer Fehler!
Microsoft kann schwere Türen zu großen Business-Firmen aufschlagen wenn es ihnen gelingt, Windows Azure Hobby-Entwicklern und kleineren Firmen näher zu bringen. Entwickler und Architekten würden dann ihre Erfahrungen mit der Plattform aus ihrem privaten (Hobby-) Umfeld mit in ihre Firmen nehmen und könnten Windows Azure in ihrem Berufsumfeld vorantreiben, wenn sie danach gefragt werden oder die Entscheidung für die Plattform einer neuen Applikation fallen soll. Folglich würde auch die Einstiegshürde für größere Firmen stark gesenkt werden: Entwickler, die Erfahrungen mit der Plattform machen konnten, wären in der Lage ihr Wissen an Kollegen weiterzugeben. Dies kann insgesamt zu einer Kettenreaktion führen und einen exponentiellen Anstieg von Entwicklern für Windows Azure bewirken. Es wäre die beste und kostengünstigste Werbung für Windows Azure die Microsoft bekommen kann.
Aktuell bleibt festzustellen dass nur wenige Entwickler Windows Azure mit gutem Gewissen weiterempfehlen werden. Bitte Microsoft: die Community zählt! Realisiert das Potential eurer Plattform und seht die Implikationen, die mit mit einer höheren Menge an Hobby-Entwicklern auf Windows Azure verbunden sind.

Notwendigkeit nach einem “Mini Azure”-Angebot

Ein weiterer Vorschlag: Microsoft sollte ein “Mini Azure”-Paket als neues Angebot seiner Azure-Plattform anbieten. Geringe Kosten (<10€ pro Monat), geringe Ressourcen, keine dedizierten Maschinen, schwache SLAs, aber 24h am Tag an 7 in der Woche online – einfach nur um Entwicklern die Möglichkeit zu geben Erfahrungen mit der Plattform zu machen. Microsoft muss diese hohe Einstiegshürde beseitigen, wenn sich die OS/2-Story nicht wiederholen soll. Die großartige Plattform führt zu nichts und wird nicht erfolgreich sein, wenn sich von niemandem verwendet wird…
Mini Azure wurde bereits von Jouni Heikniemi vorgeschlagen, er und andere haben weiterführende Ideen in diesem Bereich, die einen Blick wert sind.

Schlussbemerkungen

Zusammenfassend lässt sich sagen: wenn sich nichts ändert fürchte ich dass es Microsoft schwer haben wird Windows Azure erfolgreich zu positionieren. Zumindest fürchte ich, dass es anfänglich ein Rohrkrepierer werden wird. Und das ist eine äußerst schlechte Basis für zukünftige Entwicklungen. Im Moment verscheucht Microsoft jede Menge Entwickler, die später nur schwer davon überzeugt werden können die Plattform doch zu nutzen. Ich sage es nochmals: wir sehen hier eine richtig gute Entwicklungsplattform. Aber die beste Plattform wird nirgendwohin führen, wenn es für Entwickler zu teuer ist diese Plattform nutzen zu wollen.
Share |

Neulich im SDX Portal… 23.06.2010

Alexander Jung
Alexander Jung, Chief eXpert

Nachruf!

Ich bin alt. Ich erinnere mich noch daran, daß man den Klassenkameraden mit dem Floppy-Drive für den C64 (5 1/4", http://de.wikipedia.org/wiki/C64) neidisch angeschaut hat, während man selbst mit der Datasette (Kassettenlaufwerk, http://de.wikipedia.org/wiki/Datasette) hantierte. Ein Diskettenlaufwerk war ein Statussymbol!

Jetzt trägt Sony die Floppy zu Grabe: "Sony schickt Floppy-Disk aufs Altenteil"

Aus diesem Grund ein kleiner Nachruf auf die Diskette:

U Hiermit tragen wir die Diskette zu Grabe. R.I.P.

Andererseits… Ich erinnere mich auch an die Zeit als ich Nachmittage damit verbracht habe, alle Disketten auf Viren zu scannen. Und an Tools für ein Refresh der Magnetisierung. Und an solche, die Dateien möglichst optimal auf mehrere Disketten verteilt haben. Und an Lesefehler. Und an... ach was soll’s. Wenn jemand nachtreten will, damit die Dinger auch ja im Grab bleiben... – ich bin dabei!

Kommentar 1: Nostalgie...

Als ich noch ein kleiner Bub war, habe ich mal bei einem Schulfreund (oder war's der Kindergarten? Ach nee, in der DDR gab's so kapitalistischen Kram ja nicht... also doch Schule) X-Wing auf 20 Disketten kopiert und daheim am 386er meines Bruders (inkl. Turbo-Taste!) wieder herunterkopiert. Diskette 18 war leider defekt, sodass ich nochmal zu meinem Kumpel hinfahren durfte und die Diskette nochmal kopiert habe...

Ach waren das schöne Zeiten...

Kommentar 2: Locher

Ich sag nur: Locher für die 2. Seite einer 5 1/4"... :)

Das waren noch Zeiten, Junge, Junge...

[UPDATE] Was es auf Wikipedia nicht alles gibt: http://de.wikipedia.org/wiki/Diskettenlocher

Kommentar 3: POKE 2040,200: POKE 2041,201: REM

Sprite-Programmierung aus der C64iger Zeitschrift ..... das waren noch Fingerübungen :-) http://www.c64-wiki.de/index.php/Sprite

Kommentar 4: Re: Nachruf!

So einen Locher hatte ich nach meiner Datasetten-Zeit auch ... kennt noch jemand Fairlight ;-)? POKE - nun ja ein Bekannter von mir hatte damals schon einen guten Macro-Assembler, mit dem man auch seine Op-Codes (auch NOP, DOP, TOP und andere nicht dokumentierte) einbauen konnte ... hat schon Spaß gemacht, als man sich noch alle OpCodes merken konnte (waren ja nur 8 Bit). Kompression hatte da auch einen anderen Stellenwert. Die 1541 und den aufgemotzen C64 habe ich noch im Keller - ich hatte unter anderem 'nen Schalter drangelötet, um auf NTSC umzuschalten ... daran war auch der CPU-Tackt gekoppelt - so ließ sich die Kiste um ein paar Herz übertackten :D

... muss mal gucken ob das Zeug überhaupt noch läuft.

Kommentar 5: RE: POKE 2040,200: POKE 2041,201: REM

Ich hatte einen VZ200. Kannte keine S**, das Ding. Und natürlich keine Doku. Ich habe damals mit POKE einfach von vorne nach hinten den Speicher überschrieben, um (diverse Abstürze später) den Graphicspeicher zu finden. Danach konnte ich meine erste Variante von Asteroids zu programmieren... . 85/86 hatte ich dann mein erstes Listing in so einer Zeitschrift - und mein erstes Geld mit der Computerei verdient ;-)

Kommentar 6: C64 mit Diskettenlaufwerk…

… habe ich samt umfangreicher Softwaresammlung für 150 Deutsche Mark von einem Schulfreund erworben. Der Clou war das DolphinDos. Die haben auf einer Zusatzplatine den ganzen C64-Kernel ersetzt und damit eine 8-bit Parallel(!)-Übertragung vom Diskettenlaufwerk ermöglicht (über ein 10-adriges Kabel). War rattenschnell das Ganze, jedenfalls im Vergleich zur seriellen Standard-Floppy.

Favorites: Auto Duel, Bruce Lee, Robo Factory

Bin aber mit der indirekten Adressierung vom 6502 nie so recht klar gekommen. Der Z80 in meinem ZX Spektrum mit seinen vier 16-bit Registern war da viel freundlicher zu programmieren.

PS: Tja, auch das ist SDX ;-)

Share |

Wie passt PowerPivot in die Microsoft Landschaft? 21.06.2010

Nicolas Meseth
Nicolas Meseth, Senior eXpert

Über PowerPivot wurde schon viel berichtet, viele haben sicher auch schon selbst gesehen und getestet. Was aber steckt wirklich dahinter? Welche Möglichkeiten gibt es? Und wie ist es in die Landschaft der anderen Microsoft Produkte integriert? Viele Fragen, auf die Microsoft und SQL CAT nun eine Antwort im Leinwandformat gegeben haben!

Bitte mindestens in DIN A2 und hochglanz ausdrucken: PowerPivot Client/Server Architecture

Das Poster ist sehr hochauflösend, zoomt einfach mal ganz nah ran und ihr werdet es sehen! Inhaltlich kann es einen schon mal überfordern! Wenn man oben links zu lesen beginnt, startet man als nette Einführung mit dem Teil, mit dem sich wohl jeder zuerst befasst: PowerPivot als Excel 2010 Plugin.

Nähern wir uns von dort dem großen Kreis in der Mitte, der die SharePoint 2010 Umgebung darstellen soll. Anstatt der In-Proc Engine, die in Excel die Verarbeitung der immensen Datenvolumen erledigt, wird hier die Last an die so genannte Vertipaq Engine übergeben, die letztlich eine SSAS Datenbank im SharePoint-Modus ist. Die Excel Services sind für die Darstellung im Browser verantwortlich. Wandern wir dort zügig nach Norden treffen wir auf die Möglichkeit, PowerPivot Workbooks als SSAS Datenquelle zu verwenden (!).

Das ist aber nur möglich, wenn ich das Workbook zuvor im SharePoint veröffentlicht habe. Unten links findet man eine Übersicht über die wirklich große Vielzahl an heterogenen Datenquellen. Da sollte für jeden etwas dabei sein!

Oben rechts sehen wir die unterstützten Browser - und siehe da: Neben dem IE ab Version 7 wird ab SharePoint 2010 auch Mozilla, Safari, sowie jeder Browser, "der sich an die Standards hält" (Aussage eine MS Mitarbeiters während des SQL PASS Camps 2010) , unterstützt. Chrome gehört nicht dazu ;-)

Das war nur ein kurzer Überflug! Befasst euch am besten selbst mit dem Poster, so viel Information auf einem Poster geballt ist selten!

Share |

Buchempfehlung – Programming Windows Azure 20.06.2010

##Name des eXperts##
Patric Schouler, Chief eXpert
book_cover_Programming_Windows_Azure Ich habe lange darauf gewartet, aber seit gut einer Woche halte ich nun das Buch “Programming Windows Azure” von Sriram Krishnan aus dem O’Reilly-Verlag in meinen Händen.
Sriram Krishan arbeitet aktuell im Windows Azure Team bei Microsoft und veröffentlichte mit “Programming Windows Azure” Anfang Juni 2010 sein Erstlingswerk. Man durfte also gespannt sein….
Mein erster Eindruck von Krishnan’s Buch ist: Der Mann weiß, wo von er spricht. Der Hauptteil des Buches beschäftigt sich zwar mit der Entwicklung von Windows Azure Anwendungen mittels des Windows Azure Toolset. Doch gibt Krishan dem Leser auch Einblicke in die Historie des Cloud Computing und einige sehr interessante Hintergrundinformationen zu Windows Azure. Einige dieser Informationen sind so verblüffend, so dass diese in mehreren kleinen Blog-Beiträgen zusammenfassen möchte. Ansonsten kann ich “Programming Windows Azure“ vom ersten Querlesen jedem Architekten und Entwickler, der sich mit Coud Computing im Zusammenhang mit Windows Azure beschäftigt, wärmstens empfehlen.
Im ersten Teil meiner zusammenfassenden Informationen aus Krishnan’s Buch möchte ich die Rolle der Hypervisor-Komponente von Windows Azure – nicht zu verwechseln mit Hyper-V von Windows Server 2008 - und die im Buch beschriebenen Optimierungen an Windows Server 2008 für Windows Azure darstellen.

Hypervisor

Windows_Azure_Onion_Pie
Wenn man sich die Schichten der Windows Azure Architektur als Zwiebelschalenmodell vorstellt, dann besteht diese im Kern aus der Hardware, der Hypervisor-Komponente und der Softwarekomponente Fabric, welche für das Management der Hardware, der Betriebssystem und der Anwendungsprogramm in der Cloud zuständig ist.
Von diesen Fabriken existieren verschiedenen Instanzen in unterschiedlichen geographischen Lokationen. Wenn man eine Windows Azure Anwendung published, kann man entscheiden, an welchen dieser Lokationen die jeweilige Anwendungskomponente laufen soll.


Was für eine Rolle spielt nun die Hypervisor-Komponente?


Wie man sich leicht vorstellen kann, wäre es fatal, wenn man in einem Data Center für Cloud Computing jede Anwendungskomponente auf dem nativen System laufen lassen würde. Die Gegenargumente sind hier unter anderem: Ressourcennutzung, Ausfallsicherheit, Systemoptimierung durch Verlagerung. Die Antwort auf diese Probleme heißt: Virtualisierung.

Dieser Ansatz ermöglicht es, eine oder mehrere Gäste-Betriebssysteme auf einem Host-Betriebssystem laufen zu lassen. Im Falle der Microsoft Data Center, ist dies ein für Windows Azure optimiertes Windows Server 2008 als Host-Betriebssystem und ein Standard Windows Server 2008 Enterprise als Gast-Betriebsumgebung.

Für die Steuerung der Virtualisierung ist nun die Hypervisor-Komponente (Virtual Machine Monitor (VMM)) zuständig. Der Hypervisor ist für die faire Verteilung der Ressourcen zwischen den virtuellen Rechnern zuständig. Um diese Aufgabe optimal erfüllen zu können, wurden von Intel und AMD verschiedene Architekturen in ihrer x86/x64-Prozessoren integriert. Ein typischer x86/x64-Prozessor hat vier verschiedene Privileg-Stufen (Rings). Betriebssystemkernprozesse laufen in der Regel in Ring 0 und Anwendungsprozesse in Ring 4. Wenn nun die Kernprozesse in Ring 0 laufen, wo sollte dann die höher privilegierte Komponente Hypervisor seine Arbeit verrichten? Intel und AMD bauten deshalb den neuen Modus “Root mode” in ihre neusten Prozessoren. Dieser Modus wird übrigens auch “Ring –1” genannt :-)

Um diese zeitkritische Komponente nun noch performanter zu machen und auf die Belange von Cloud Computing zu optimieren, hat man sich im Windows Azure Team entschlossen, eine eigene Windows Server 2008 Hypervisor-Komponente zu entwickeln.
Mit einigen anderen Betriebsystem-Erweiterungen ist die Windows Azure-Basis also lediglich ein Windows Server 2008-nahes Betriebssystem.

Share |

Microsoft Business Intelligence: Nicht mehr nur für die Kleinen 18.06.2010

Nicolas Meseth
Nicolas Meseth, Senior eXpert
Dass der Business Intelligence Stack von Microsoft als kostengünstige Alternative zu den anderen Herstellern wie SAP oder Oracle durch sein "Alles aus einer Hand" Angebot bei kleinen und mittelständischen Unternehmen sehr beliebt ist, dürfte bekannt gewesen sein. Laut der Gartner Studie "Magic Quadrant for Business Intelligence Platforms" aus dem Januar dieses Jahres schließt Microsoft mittlerweile auch zu den "Großen" auf, und zwar Kunden - nicht Herstellern. (Das aber sicher auch!). Gartner platziert Microsoft im Magic Quadrant im oberen rechten Abschnitt, zusammen mit IBM, Oracle, Microstrategy und SAP - den "Leadern" und "Visionären" eben. Gründe hierfür gibt es laut Gartner mehrere, hauptsächlich jedoch folgende:
  • Alles aus einer Hand: Datenbank, ETL Tool, Reporting, OLAP und Frontend (SharePoint)
  • Gute Unterstützung für Entwickler durch einheitliche Umgebungen .NET und Visual Studio
  • Niedrige Kosten (total cost of ownership) und Benutzerfreundlichkeit
Und jetzt die Überraschung:
"While Microsoft's Business Intellgence products have historically been labeled as midmarket solutions, we are seeing the Microsoft Business Intelligence platform move up "the food chain" and be deployed on much larger data volumes to much larger number of users, with more of its customers considering it their BI platform standard than in previous years. Customers in the Magic Quadrant survey report that their Microsoft average deployment sizes are smaller only than those of Acutate (users), SAP (users) and MicroStrategy (data volume)" (Gartner 2010)
Zudem wird erwähnt, dass Produkte wie SharePoint 2010, Excel 2010 und PowerPivot zum Zeitpunkt der Studie nicht berücksichtigt wurden (offensichtlich weil es sie noch nicht gab ;-)) Mit diesen drei neuen starken Spielern wird Microsoft im nächsten Gartner Report höchstwahrscheinlich noch besser abschneiden.
Share |

Transaktionen vs. Entity Framework 16.06.2010

Alexander Jung
Alexander Jung, Chief eXpert

 

Fast jede Anwendung die Daten ändert wird sich irgendwann mit dem Thema Transaktionen auseinandersetzen müssen. LINQ2SQL (und ADO.NET Entity Framework analog) hat hier eine Eigenheit der man sich bewusst sein sollte.


Wenn man einen LINQ2SQL Datenkontext ohne besondere Vorkehrungen verwendet, ergibt sich bzgl. Transaktionen folgendes Bild:

  • Ein Aufruf an SubmitChanges wird in eine lokale (d.h. Datenbank-) Transaktion gekapselt.
  • Mehrere Aufrufe an SubmitChanges laufen jeweils getrennt in ihrer eigenen Transaktion, also nicht übergreifend transaktional sicher.
Typischerweise baut man bei Bedarf eine Transaktionsklammer über TransactionScope auf um bei mehreren Aufrufen an SubmitChanges bzw. auch über mehrere Aufrufe hinweg transaktional sicher zu arbeiten. Das bringt aber ein kleine Konsequenz mit sich:
  • Mit einem TransactionScope als Klammer laufen alle SubmitChanges in der Regel in einer DTC-Transaktion. Das gilt auch für ein einzelnes(!) SubmitChanges!
Der DTC (Distributed Transaction Coordinator, mdsn) hat normalerweise die Aufgabe, Transaktionen über verschiedene Resourcen hinweg (etwa Datenbank und Message Queue oder auch zwei Datenbanken) zu koordinieren. Das ist hier aber nicht der Fall. Und solange man nicht tatsächlich mehrere Resourcen hat ist die Nutzung des DTC an sich überflüssig. Zudem kann sie zu unerwarteten Problemen führen, wenn im Betrieb der DTC nicht eingeschaltet ist oder keinen Netzzugriff hat. (Auf Entwicklerrechnern ist er üblicherweise verfügbar, man rechnet also nicht mit diesem Problem.)

Der Grund dafür daß der DTC hier überhaupt verwendet wird liegt in der Arbeitsweise von Datenbank-Transaktionen und des LINQ2SQL Datenkontext begründet: Datenbank-Transaktionen sind an die Datenbank-Connection gebunden, sobald eine Connection freigegeben wird aber eine Transaktionsklammer offen bleibt, muß diese Transaktion von einer lokalen zu einer DTC-Transaktion “befördert” werden.
LINQ2SQL tut aber genau das. Die Connection wird intern nur on-demand, d.h. während des SubmitChanges, angefordert und auch sofort wieder freigegeben. Im Sinne skalierbarer Anwendungen ist das genau das gewünschte Verhalten, aber es bringt eben besagte Konsequenz bzgl. Transaktionen mit sich.
Vermeiden läßt sich das indem man explizt context.Connection.Open() aufruft. In diesem Fall honoriert der Datenkontext die Tatsache, dass man selbst die Kontrolle übernommen hat und gibt die Connection nur auf explizites Close() oder im Dispose wieder frei. Somit kann auch eine Transaktion als lokale Transaktion durchgeführt werden.
 
Wenn man den DTC nicht braucht und bewußt nicht verwenden will, dann sollte man den DTC auf den Entwicklerrechnern abschalten (der Service ist normalerweise gestartet). Man hat nämlich kaum eine Chance mitzubekommen, ob der DTC nicht doch irgendwo angezogen wird. Ist der Service down, bekommt man hingegen einen Fehler und wird auf das Problem hingewiesen.
Share |

JPMCC: Die eXperts fielen auf! 15.06.2010

Svenja Henß
Svenja Henß, Senior Assistant

Dieses Jahr war die SDX mit 20 aktiven Läufern bei der J.P. Morgan Corporate Challenge dabei. Die Stimmung an der Strecke war wieder mal einfach genial. Gänsehautfeeling pur!

Dank unserer knalligen Shirts fielen wir nicht nur in der Masse der Läufer auf, sondern auch den Fotografen der Runners World, siehe hier und hier.

Gemeinsam mit dem Anfeuerteam ließen wir den Abend auf der Aussenterrasse des Kubu bei kühlem Bier und leckerem Essen ausklingen. Es war ein unvergessliches Erlebnis und wir freuen uns schon auf das nächste Jahr!

Auf gehts zur Startaufstellung (SDX AG; JPMCC)Im Startgedränge (SDX AG JPMCC) Lauf-Shirt (SDX AG, JPMCC)SDX AG, JPMCC SDX AG,  JPMCCSDX AG, JPMCC CIMG0327After Run (SDX AG, JPMCC) After Run (SDX AG, JPMCC)After Run (SDX AG, JPMCC) After Run (SDX AG, JPMCC)After Run (JPMCC, SDX AG)

After Run (SDX AG, JPMCC)

Share |

WinMerge in Visual Studio einbinden 13.06.2010

Matthias Jauernig
Matthias Jauernig, Senior eXpert

Gibt es Konflikte beim Einchecken von Sourcen in den TFS, so bringt Visual Studio von Haus aus ein Tool mit, mit welchem sich Dateien gegenüberstellen und Konflikte beheben lassen. Dieses Tool ist allerdings recht rudimentär, der Bedienkomfort und das Finden der Konflikte lassen zu wünschen übrig.

Viel angenehmer ist das freie Tool WinMerge (http://winmerge.org/), was auch ideal zum "normalen" Vergleichen von Dateien verwendet werden kann. Dieses lässt sich auch in Visual Studio einbinden und ersetzt dabei das Standard-Tool zum manuellen Mergen.

Folgende Anleitung habe ich dafür gefunden (Quelle: http://www.neovolve.com/post/2007/06/19/using-winmerge-with-tfs.aspx):

In Visual Studio do the following:

  • Click on Tools menu
  • Click on Options menu item
  • Expand Source Control tree item
  • Select Visual Studio Team Foundation Server tree item
  • Click on Configure User Tools... button

Comparing

To use WinMerge as the Compare/Diff tool:

  • Click the Add... button
  • For Extension, type *
  • For Operation, select Compare
  • For Command, browse for C:\Program Files\WinMerge\WinMerge.exe
  • For Arguments, type /x /e /ub /wl /dl %6 /dr %7 %1 %2
  • Click OK to accept

Merging

To use WinMerge as the Merge tool:

  • Click the Add... button
  • For Extension, type *
  • For Operation, select Merge
  • For Command, browse for C:\Program Files\WinMerge\WinMerge.exe
  • For Arguments, type /x /e /ub /wl /dl %6 /dr %7 %1 %2 %4
  • Click OK to accept

Note: You need to click on the Save button on the tool bar within WinMerge merge to commit a merge before exiting the screen

Share |

Was ist neu in Excel 2010? 12.06.2010

Nicolas Meseth
Nicolas Meseth, Senior eXpert
Mit Office 2010 kommt auch eine neue Version des allseits beliebten Tabellenkalkulationsprogramms Excel. Dass es längst nicht mehr nur das ist, sollte spätestens seit der Version 2007 jeder mitbekommen haben. Microsoft positioniert Excel strategisch als DAS primäre Business Intelligence (BI) Frontend, und unterstreicht dies mit der Weiterentwicklung der Business Intelligence (BI) Features in Excel 2010. Zudem bekommt Excel Verstärkung: Mit PowerPivot an seiner Seite werden alle Grenzen bezüglich Datenvolumen und Performance endgültig aufgehoben (oder?). Excel in der Version 2010 alleine bietet jedoch auch ohne PowerPivot schon eine Menge interessanter neuer Features:
  • Slicers: Slicer erweitern die Möglichkeit, Daten visuell zu filtern und zu analysieren. Ein Slicer kann auf eine beliebige Dimension in einer Pivottabelle gesetzt werden. Von nun an steht ein grafisches Element zur Verfügung, mit dem ein oder mehrere Elemente ausgewählt werden können. Die Auswahl hat direkten Einfluss auf die angezeigten Daten in der verbundenen Pivot-Tabelle. Der große Vorteil ist hier die sehr gute Übersichtlichkeit. Elemente mit Fakten-Daten werden farblich hervorgehoben, die ohne werden grau hinterlegt. Zudem werden die Elemente in anderen Slicern aktualisiert. Wenn ich beispielsweise im Slicer "Kunden" einen Auswahl treffe, so werden im Slicer "Bundesland" automatisch nur die Bundeländer markiert, in denen Kunden der aktuellen Auswahl leben. Umgekehrt könnte man eine Auswahl von Bundesländern treffen und der Kunden-Slicer würde die betroffenen Kunden farblich hervorheben. Dies funktioniert über beliebig viele Slicer hinweg. Außerdem bieten Slicer eine sehr gute Suchfunktion, die einem das Auffinden eines bestimmten Elements in einer Dimension erleichtert.
  • Eigene Sets definieren: Eigene Sets zu definieren ist ein lange erwartetes Feature. Sets können entweder per MDX Query oder über einen grafischen Editor definiert werden und später in Pivot Tables verwendet werden. So kann man z.B. öfters zu analysierende Kunden zu einem Set zusammenfassen. Die dynamische Variante geht ebenfalls; ein Beispiel für ein dynamisches Set wäre z.B. die Top 20 der profitabelsten Verkäufer. Dynamische Sets aktualisieren sich bei Veränderungen der Zahlen automatisch.
  • Cube Write-back: Diese Möglichkeite gab es auch vorher, jedoch nicht aus Excel heraus. Zahlen direkt in den Cube schreiben zu können ermöglicht es, aus Excel 2010 heraus Planungszahlen in den Cube einzupflegen. Zudem können in Verbindung mit berechneten Kennzahlen What-If Szenarien in Excel realisiert werden. Für den Fachanwender ein sehr mächtiges Werkzeug.
  • Sparklines und Data Bars: Sparklines bieten eine komfortable Möglichkeit an, die Entwicklung einer Kennzahl im Zeitverlauf auf einen Blick zu sichten. Sparklines können in Excel 2010 durch das Auswählen der relevanten Zellen per Mausklick erzeugt werden. Data Bars bieten eine Möglichkeit, die Verteilung einer Kenngröße auf verschiedene Kategorien zu visualisieren. So können z.B. auf einen Blick die umsatzstärksten Filialen identifiziert werden, ohne die einzelnen Zahlen zu vergleichen.
Share |

Kleine LINQ-Falle - Queryable vs. Enumerable 10.06.2010

Alexander Jung
Alexander Jung, Chief eXpert

Es gibt eine kleine Falle beim Zugriff auf die Datenbank mittels LINQ (und ich habe schon mehr wie einen gesehen, der darauf hereingefallen ist): Es ist nicht immer offensichtlich welcher Teil der LINQ-Abfrage im Speicher durchgeführt wird, und welcher in der Datenbank.

Das generelle Problem ist, daß der C# Compiler nicht darauf hinweist (von einer deutlichen Warnung ganz zu schweigen) ob er im Einzelfall LINQ to SQL (bzw. Entity Framework) verwendet, oder LINQ to Objects.

Ein einfaches Beispiel: Per LINQ to SQL sollen Daten abgeholt werden, wobei das Filterkriterium als Lambda übergeben wird:

   1: public static IEnumerable<Customer> GetCustomers(Func<Customer, bool> predicate) 
   2: { 
   3:     using (MyDataContext dc = new MyDataContext()) 
   4:     { 
   5:         IQueryable<Customer> query = from customer in dc.Customers select customer;
   6:  
   7:         if (predicate!=null) 
   8:             query = query.Where(predicate).AsQueryable();
   9:  
  10:         return query.ToList(); 
  11:     } 
  12: }

Und der Aufruf:

   1: void Foo() 
   2: { 
   3:         var customers= DataAccess.GetCustomers(c=>c.City=="Mainz"); 
   4:         ... 
   5: }

Man packe 5 Mio Kunden in die Datenbank und selektiere dann einen kleinen Teilausschnitt, sagen wir 100 Datensätze…

Wer jetzt davon ausgeht, dass nur 100 Datensätze aus der Datenbank gelesen werden, den muß ich leider enttäuschen. Tatsächlich werden alle 5 Mio Kunden in den Speicher gesaugt, erst dort werden die unerwünschten Daten dann aussortiert.

Das Warnsignal ist der notwendige Aufruf von AsQueryable(). Problem ist, daß mit dem Where nicht die Extension-Methode in Queryable aufgerufen wird (die würde die Bedingung an LINQ2SQL weitergeben und den Filter in der DB anwenden), sondern an Enumerable. Dadurch wird aber die ganze Abfrage – ohne Filter – an die Datenbank geschickt, Enumerable bastelt lediglich einen Filter-Iterator über das Resultset, der ganz normal als Funktionalität im Speicher auf beliebigen Listen arbeitet.

Der entscheidende Knackpunkt im obigen Beispiel ist die Deklaration des predicate, Queryable.Where(Expression<Func<T, bool>>) erwarter hier eine Expression; ohne diese kleine Feinheit greift der Compiler auf Enumerable.Where(Func<T, bool>) zurück. Also:

   1: public static IEnumerable<Customer> GetCustomers( Expression< Func<Customer, bool> > predicate)

Dann klappt's auch mit dem Nachbarn.

Das ist eine Falle, in die man leicht mal aus Unachtsamkeit reinlaufen kann. Sowohl wegen solche Fallstricke, als auch grundsätzlich lohnt es sich beim Einsatz von LINQ2SQL bzw EF den SQL Profiler nebenher laufen zu lassen, um sich anzuschauen, welche Abfragen tatsächlich in der Datenbank ankommen.

Share |

Ankündigung SDX Technical Councils! 07.06.2010

Die Vorbereitungen laufen bereits auf Hochtouren: In den kommenden Wochen werden (kostenlose) Technical Councils zu den folgenden Themen im SDX Office stattfinden:

16. Juni 2010 .NET 4.0 Web-Technologien
30. Juni 2010 Agiles Projektmanagement mit Scrum
26. August 2010 Windows Presentation Foundation im Einsatz
14. September 2010 Self-Service BI mit SQL Server 2008 R2, Excel 2010 und Power Pivot
07. Oktober 2010 Silverlight 4.0 und Windows Azure
2. Halbjahr Optimierung nicht trivialer SQL Server Datenbanken
2. Halbjahr Team Foundation Server 2010 und Scrum
2. Halbjahr Federated Identity Management

Zunächst informieren die eXperts über das jeweilige Thema und danach klingt der Abend in lockerer Atmosphäre bei einem gemeinsamen Abendessen aus. Die Technical Councils richten sich an Developer, Architekten sowie technische Projektleiter.

Interessiert? Weitere Infos zu den Technical Councils und zur Anmeldung gibt es unter www.sdx-ag.de/sdxag/news.aspx

Share |

Mocks Aren’t Stubs 04.06.2010

Matthias Jauernig
Matthias Jauernig, Senior eXpert

Bei Unit Tests entsteht häufig in die Situation, dass konkrete Implementierungen einer Klasse gegen Pseudo-Implementierungen ausgetauscht werden sollen, welche bestimmte Teilaspekte abbilden. Je nach Zweck des Pseudo-Objekts kann es hier zu sehr unterschiedlichen Ausprägungen kommen. Deswegen ist es auch falsch, alle diese Pseudo-Objekte als “Mock” zu bezeichnen. Für konkrete Projekte kann man festhalten: Es sollten Namenskonventionen für Test-Objekte eingeführt und auch eingehalten werden…

Auch Martin Fowler hat sich des Themas angenommen und einen nicht mehr ganz neuen, aber sehr lesenswerten Beitrag dazu geschrieben: Mocks Aren't Stubs.

Hier der wichtigste Teil daraus:

[Use] the term Test Double as the generic term for any kind of pretend object used in place of a real object for testing purposes. The name comes from the notion of a Stunt Double in movies. [Use] four particular kinds of double:

  • Dummy objects are passed around but never actually used. Usually they are just used to fill parameter lists.
  • Fake objects actually have working implementations, but usually take some shortcut which makes them not suitable for production (an in memory database is a good example).
  • Stubs provide canned answers to calls made during the test, usually not responding at all to anything outside what's programmed in for the test. Stubs may also record information about calls, such as an email gateway stub that remembers the messages it 'sent', or maybe only how many messages it 'sent'.
  • Mocks are [...] objects pre-programmed with expectations which form a specification of the calls they are expected to receive.

Of these kinds of doubles, only mocks insist upon behavior verification. The other doubles can, and usually do, use state verification. Mocks actually do behave like other doubles during the exercise phase, as they need to make the SUT [(System Under Test)] believe it's talking with its real collaborators - but mocks differ in the setup and the verification phases.

Share |

Verknüpfen von Expressions zu einer neuen Expression 01.06.2010

Alexander Jung
Alexander Jung, Chief eXpert

Man kann LINQ Ausdrücke relativ einfach miteinander verknüpfen, indem man einfach einen Ausdruck anhängt. So lassen sich zum Beispiel Filterkriterien dynamisch anfügen, abhängig davon, ob eine Eingabe erfolgt ist, oder nicht:

   1: void List<Customer> GetCustomers(FilterData fd)
   2: {
   3:         Func<Customer, bool> filter= c=>true;
   4:         if (fd.City!=null)
   5:                 filter= c => filter(c) && (c.City==fd.City);
   6:         if (fd.Zip!=null)
   7:                 filter= c => filter(c) && (c.Zip==fd.Zip);
   8:         ...
   9: } 

Versucht man das allerdings mit LINQ to SQL oder gegen das Entity Framework hat man es nicht mehr mit einfachen Lambdas, sondern mit Expressions zu tun. Und Expressions bringen den Nachteile mit, daß sie sich nicht mehr so einfach verketten lassen… Wenn man filter im obigen Beispiel als Expression<Func<Customer, bool>> deklariert klappt das nicht mehr, weil die Aufrufsyntax bei Expressions nicht gegeben ist. Man kann sich hier retten indem man eine Liste von Expressions aufbaut, aber dann ist man auf die immer gleiche Konjunktion eingeschränkt. Will man das auflösen... viel Arbeit.

Man kann auch versuchen die einzelnen Expression zusammenzustöppseln. Problem dabei ist immer, daß die einzelnen Ausdrücke den selben Parameter verwenden müssen (nicht den gleichen), d.h. unter der Haube muß die selbe ParameterExpression-Instanz verwendet werden), was im Besipiel oben gerade nicht der Fall ist – und in C# auch nicht ausgedrückt werden kann. Die möglichen Lösungs-Varianten dazu sind:

  • Expressions komplett von Hand aufbauen. Man schreibt dan quasi seinen eigenen Compiler ;-)
  • Expressions verknüpfen: über eine Expression für And bzw Or werden die beiden anderen verknüpft. Dem Parameter-Problem geht man aus dem Weg, indem man die beiden Ausdrücke per InvokeExpression auswerten läßt. Pferdefuss: das geht prinzipiell, wird aber leider nicht von LINQ2Entites/EF unterstützt, da diese ein Problem mit InvokeExpression haben.
  • Man parst die beteiligten Expressions (man muß hier wirklich den Expression-Tree ablaufen) und tauscht die Parameter-Referenzen der einen Expression durch den Parameter der anderen aus. Viel Handarbeit und übler Code.

PS: Nachdem dieser Beitrag fertig war bin ich über folgenden Blog-Beitrag gestolpert, der genau das beschreibt. Hier findet sich auch Beispiel-Code: http://blogs.msdn.com/meek/archive/2008/05/02/linq-to-entities-combining-predicates.aspx

Share |