是否可以用表达式替换作业?

时间:2016-07-05 18:04:17

标签: c# entity-framework expression-trees

我有一个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 = ????有可能吗?

注意:我知道我可以改为使用扩展方法,并使用switch-case来提高可读性。但是,上面的代码用于实体框架的上下文中,并且必须是表达式。这也排除了使用Expression.Compile()

1 个答案:

答案 0 :(得分:1)

没有一些表达式助手库是不可能的。

使用AsExpandableInvoke扩展程序LinqKit,您可以通过以下方式执行此操作:

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