2016-07-05 19 views
0

Ich habe eine Methode eines Web-API-Steuerung, die die DB-Abfragen und gibt Daten:Kann eine Zuweisung durch einen Ausdruck ersetzt werden?

public IQueryable<DeviceInformation> GetAllRegisteredDevices() 
{ 
    var result = this.db.CustomDeviceInstallations.Select(install => new DeviceInformation 
    { 
     Platform = 
      install.Platform == NotificationPlatform.Apns ? PLATFORM.iOS : 
      install.Platform == NotificationPlatform.Gcm ? PLATFORM.Android : 
      PLATFORM.Unknown 
    }); 

    return result; 
} 

Welche nervt mich bei diesem Verfahren ist die Entscheidung über die Plattform zugeordnet ist. Ich werde die gleiche Entscheidung in einem anderen Kontext benötigen und deshalb möchte sie extrahieren, so dass ich am Ende mit:

public Expression<Func<NotificationPlatform, PLATFORM>> ToDeviceInfoPlatformExpression() 
{ 
    return p => 
     p == NotificationPlatform.Apns ? PLATFORM.iOS : 
     p == NotificationPlatform.Gcm ? PLATFORM.Android : 
     PLATFORM.Unknown; 
} 

Die Frage ist nun: Wie kann ich meinen Ausdruck verwenden? Platform = ???? Ist es überhaupt möglich?

Hinweis: Ich weiß, ich könnte stattdessen eine Erweiterungsmethode verwenden und auch einen Schalter-Fall für die Lesbarkeit verwenden. Der obige Code wird jedoch im Kontext von Entity Framework verwendet und muss ein Ausdruck sein. Dies schließt auch die Verwendung von Expression.Compile() aus.

+0

Es ist unklar, warum Sie einen Ausdruck Baum überhaupt verwenden. Was ist falsch an deinem Originalcode? –

+0

Hauptsächlich Neugier. Secondary: Mehrfache Zuordnung ohne Kopieren des Codes. – Krumelur

+0

Wow, ehrlich gesagt, bin ich überrascht von den "nahen" Stimmen und dem Down Voting. Ich dachte, das wäre eine interessante Frage. Aber es scheint, dass ich völlig falsch lag. – Krumelur

Antwort

1

Ist nicht möglich ohne eine Expression-Helfer-Bibliothek.

Hier ist, wie Sie tun können, dass mit LinqKit mit AsExpandable und Invoke Erweiterungsmethoden:

// First you need to put the expression into a variable 
// Without that you'll get the famous EF method not supported exception 
var deviceInfoPlatform = ToDeviceInfoPlatformExpression(); 
// Then you can use it inside the query 
var result = this.db.CustomDeviceInstallations 
    .AsExpandable() 
    .Select(install => new DeviceInformation 
    { 
     Platform = deviceInfoPlatform.Invoke(install.Platform) 
    });