如何在LINQ中获取动态字段

时间:2011-09-26 08:40:33

标签: c# linq

这是我的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;
    }

表达式树是解决方案吗?

2 个答案:

答案 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>

第一个键是环境,内部词典中的键是设置键。然后你就会被设定,这将是动态的。