2011-09-26 29 views
0

动力场这里是我的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 
           }; 

正如你看到的,我硬编码的三个环境本地主机,开发和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

使用从没有连接原因到笛卡尔积,我认为它对你的情况没有用,所以使用连接,也有太多的连接(即多于三个)可能会导致不良的性能,我认为如果可能的话,检查你的设计并以另一种方式做。 –

+0

感谢您的评论,我要编辑我的帖子使用加入 – Gui

回答

2

如果你想创建一个动态查询,您可以使用动态LINQ运营商,在此链接可用:http://msdn.microsoft.com/en-us/bb330936.aspx(下载C#示例,并得到在\ LinqSamples \ DynamicQuery目录代码)

还有一个由Royd Brayshay定义的动态Join运算符。请参阅堆栈溢出问题How to create a dynamic LINQ join extension method

+0

好吧,我试试看。 – Gui

+0

示例DynamicQuery似乎符合我的需求,您是否有关于如何使用动态查询翻译我的倍数的示例?给出的示例使用带硬编码集合的lambda表达式:var query = db.Customers.Where(“City == @ 0 and Orders.Count> = @ 1”,“London”,10)。 OrderBy(“公司名称”)。 选择(“New(CompanyName as Name,Phone)”); – Gui

+0

@John在网上有一些例子,本文为动态凡条件http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq- dynamic-query-library.aspx 并参阅Royd Brayshay示例用于加入示例或来自 –

0

我会将您的设置变量存储在字典中。那么它会更具活力。字典应该看起来像Dictionary<string, Dictionary<string, string>

第一个键是环境,内部词典中的键是设置键。那么你会一切设置,这将是动态的。

+0

不幸的是,我仍然有三个字典<字符串,字典<字符串,字符串>功能的环境数量,我有,并且等于我拥有的DataStore的数量。例如,在开发环境中,我有一个sql服务器,但在Prod中我也有一个sql服务器。所以我必须查询每个环境,我会从多个查询中得到我的查询。 – Gui

+0

我想你应该澄清你的问题一点你想达到什么。现在它只是说,“这里有一些linq,这是正确的方式吗?”试着确切地说明你的问题是什么以及你想要解决什么,那么帮助你会容易得多。 –

+0

托马斯,谢谢你的评论,你说得对。我要编辑我的帖子以使其更清晰。 – Gui