如何在LINQ中获得动态字段
本文关键字:动态 字段 LINQ | 更新日期: 2023-09-27 18:09:44
下面是我的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;
}
表达式树是一个解决方案吗?
如果你想创建一个动态查询,你可以使用动态LINQ操作符,可以在这个链接:http://msdn.microsoft.com/en-us/bb330936.aspx(下载c#示例并在'LinqSamples'DynamicQuery目录中获取代码)
还有一个由Royd Brayshay定义的动态Join操作符。参见栈溢出问题如何创建动态LINQ连接扩展方法。
我会将您的设置变量存储在字典中。这样就会更有活力。字典应该看起来像Dictionary<string, Dictionary<string, string>
。
第一个键是environment,内部字典中的键是settings键。然后你就可以设置好了,它就是动态的