这是我的LINQ查询:
var settingViewModels = from l in settingsByEnvironment["Localhost"]
join d in settingsByEnvironment["Dev"] on l.Key equals d.Key
join p in settingsByEnvironment["Prod"] on d.Key equals p.Key
select new MyKeyValue
{
Key = p.Key,
LocalhostValue = l.Value,
DevValue = d.Value,
ProdValue = p.Value
};
如您所见,我在代码的两个部分中对三个环境Localhost,Dev和Prod进行了硬编码。
如果明天,我有一个新的环境怎么办?我的代码不是动态的。
我尝试使用ExpandoObject,但仍然无法进行完整的动态查询。这是我之前使用ExpandoObject的LINQ代码的等价物;
// listSettingsEnvLocalhost is of type Tuple<string (environmentName), List<SettingViewModels>>
public void GetSettingsValueForEachEnvironment()
{
var foo = from p in listSettingsEnvLocalhost.Item2
join a in listSettingsEnvDev.Item2 on p.Key equals a.Key
let environmentLocalhost = listSettingsEnvLocalhost.Item1
let environmentDev = listSettingsEnvDev.Item1
select ToExpando(p, a, environmentLocalhost, environmentDev);
}
private dynamic ToExpando(SettingViewModel first, SettingViewModel second, string environmentLocalhost, string environmentDev)
{
dynamic o = new ExpandoObject();
((IDictionary<string, object>)o).Add("Key", first.Key);
((IDictionary<string, object>)o).Add(environmentLocalhost, first.Value);
((IDictionary<string, object>)o).Add(environmentDev, second.Value);
return o;
}
表达式树是解决方案吗?
答案 0 :(得分:2)
如果要创建动态查询,可以使用此链接提供的动态LINQ运算符:http://msdn.microsoft.com/en-us/bb330936.aspx(下载C#示例并获取\ LinqSamples \ DynamicQuery目录中的代码)
还有一个由Royd Brayshay定义的动态Join运算符。请参阅Stack Overflow问题 How to create a dynamic LINQ join extension method 。
答案 1 :(得分:0)
我会将您的设置变量存储在字典中。然后它会更有活力。字典应该看起来像Dictionary<string, Dictionary<string, string>
。
第一个键是环境,内部词典中的键是设置键。然后你就会被设定,这将是动态的。