2016-07-05 5 views
0

У меня есть метод контроллера Web API, который запрашивает БД и возвращает данные:Возможна ли замена задания?

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; 
} 

Какие ошибки мне в этом методе является решение о платформе быть назначены. Мне потребуется такое же решение в других контекстах, и поэтому хотел бы извлечь его, так что я закончил с:

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

Вопрос теперь: как я могу использовать мое выражение? Platform = ???? Возможно ли вообще?

Примечание: Я знаю, что вместо этого я мог бы использовать метод расширения, а также использовать коммутационный футляр для удобства чтения. Однако приведенный выше код используется в контексте Entity Framework и должен быть выражением. Это также исключает использование Expression.Compile().

+0

Неясно, почему вы используете дерево выражения на всех. Что случилось с вашим исходным кодом? –

+0

Главным образом любопытство. Вторичный: с одним и тем же назначением несколько раз без копирования кода. – Krumelur

+0

Вау, честно говоря, меня удивляют «близкие» голоса и голосование. Я думал, что это будет интересный вопрос. Но, похоже, я был совершенно неправ. – Krumelur

ответ

1

Невозможно без какого-либо выражения вспомогательная библиотека.

Вот как вы можете сделать это с помощью LinqKitAsExpandable и Invoke методы расширения:

// 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) 
    }); 

 Смежные вопросы

  • Нет связанных вопросов^_^