我有一个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()
。
答案 0 :(得分:1)
没有一些表达式助手库是不可能的。
使用AsExpandable
和Invoke
扩展程序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)
});