2017-04-03 53 views
1

我有基于输入枚举参数选择列

Id | UserId | GoogleEnabled | FacebookEnabled | TwitterEnabled 

在代码中,我要选择{provider}Enabled值的价值列的表 - 输入枚举

enum Provider 
{ 
    Google, 
    Facebook, 
    Twitter 
} 

private async Task CheckSettingsAsync(ISeedSession<IDbSession> seedSession, IUserInfo user, Provider provider){ 
... 
var userSettingsTask = seedSession 
       .Query<UserSettings>() 
       .Where(us => us.UserId == user.UserId) 
       .Select(us => us.GoogleEnabled) // if provider value is "Google" 
       .SingleAsync(); 
... 
} 

true/false基地是否有任何模式/解决方案比创建一些switch来选择我的价值?

回答

1

您可以手动构建表达us => us.GoogleEnabled,像这样:

var argument = Expression.Variable(typeof(UserSettings)); 
// assuming `provider` is enum with values "Google" etc 
var accessor = (Expression<Func<UserSettings, bool>>) Expression.Lambda(
    Expression.PropertyOrField(argument, provider.ToString() + "Enabled"), argument); 

,然后用它是这样的:

var userSettingsTask = seedSession 
    .Query<UserSettings>() 
    .Where(us => us.UserId == user.UserId) 
    .Select(accessor) // < here 
    .SingleAsync(); 
+0

没错,这个人可以作为解决办法,但我怕,如果有人创建不是来自此模板“{provider} Enabled”的列。 – demo

+0

目前尚不清楚您的担忧。您的提供商具有“Google”,“Facebook”,“Twitter”值,并且您拥有相应的已启用列 - 可能出现什么问题? – Evk

+0

如果你的意思是有人可能为没有“ProviderEnabled”列的枚举添加新值 - 它会抛出一个异常,但你会期望什么结果? – Evk