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
};
正如你看到的,我硬编码的三个环境本地主机,开发和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;
}
表达式树是一个解决方案吗?
使用从没有连接原因到笛卡尔积,我认为它对你的情况没有用,所以使用连接,也有太多的连接(即多于三个)可能会导致不良的性能,我认为如果可能的话,检查你的设计并以另一种方式做。 –
感谢您的评论,我要编辑我的帖子使用加入 – Gui