如何在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中获得动态字段

如果你想创建一个动态查询,你可以使用动态LINQ操作符,可以在这个链接:http://msdn.microsoft.com/en-us/bb330936.aspx(下载c#示例并在'LinqSamples'DynamicQuery目录中获取代码)

还有一个由Royd Brayshay定义的动态Join操作符。参见栈溢出问题如何创建动态LINQ连接扩展方法

我会将您的设置变量存储在字典中。这样就会更有活力。字典应该看起来像Dictionary<string, Dictionary<string, string>

第一个键是environment,内部字典中的键是settings键。然后你就可以设置好了,它就是动态的