LINQ to hash - 无法获得正确的转换!

时间:2011-05-02 02:16:18

标签: c# asp.net-mvc linq-to-entities

我在SQL Server中有一个包含3列,域,键和值的表。我想最终得到一个我可以在dot-net中使用的哈希。我正在使用EF 4.0。

起初我试过了:

List<Dictionary<string, string>> myHash = db.Registries
  .Where(x => x.Domain == "Pricing")
  .Select(x => new { Key = x.Key, Value = x.Value });

抱怨:

  

错误3无法将类型'System.Linq.IQueryable'隐式转换为'System.Collections.Generic.List&gt;'。存在显式转换(您是否缺少演员?)C:\ Users \ ekkis \ Documents \ Visual Studio 2010 \ Projects \ SkillScore \ Website \ Controllers \ HomeController.cs 53 21网站

显然需要调整选择的类型。我已经搞了半个小时(我很无用!)但是没能使它工作(上帝我想念IRC)。帮助任何人?

2 个答案:

答案 0 :(得分:3)

听起来这就是你所需要的:

List<Dictionary<string, string>> myHash = db.Registries
                                            .GroupBy(x => x.Domain)
                                            .Select(g => g.ToDictionary(x => x.Key, 
                                                                        x => x.Value))
                                            .ToList() ;

这会为每个域创建一个单独的字典,并将它们全部放在一个列表中。但这并不完全有用,因为您丢失了有关域名的信息 - 可能Dictionary<string, Dictionary<string,string>>更符合您的要求(将域名作为外部词典的键)。

您可以直接使用ToDictionary()获取单个域的字典:

var pricingDictionary = db.Registries
                          .Where(x => x.Domain == "Pricing")
                          .ToDictionary( x => x.Key, 
                                         x => x.Value);

请注意,pricingDictionary的类型为Dictionary<string, string>,因此如果您需要完整类型,则可以执行以下操作:

Dictionary<string, string> myHash = db.Registries
                                      .Where(x => x.Domain == "Pricing")
                                      .ToDictionary( x => x.Key, 
                                                     x => x.Value);

答案 1 :(得分:0)

我对以下内容感兴趣:“如何在LINQ查询中构建字典词典”。

这是我的拙劣尝试,未经测试,因为我没有LINQ-DB,因为我没有IIS,因为我无法安装IIS以获得“正版”原因猜测。

请随时编辑此代码以修复它(如果它已损坏)。

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args) {
            var registries = FetchAllRegistries();
            foreach ( KeyValuePair<string, Dictionary<string,string>> domain in registries ) {
                Console.WriteLine("Domain: "+domain.Key);
                foreach ( KeyValuePair<string,string> entry in domain.Value ) {
                    Console.WriteLine("  "+entry.Key+" "+entry.Value);
                }                
            }
        }

        private static Dictionary<string, Dictionary<string, string>> FetchAllRegistries() {
            return db.Registries
                .GroupBy(x => x.Domain)
                .Select(g => g.ToDictionary(
                    d => d.Domain,
                    d => d.ToDictionary(
                        kv => kv.Key,
                        kv => kv.Value
                    )
                ))
            ;
        }

        private static Dictionary<string, Dictionary<string, string>> FetchRegistry(string domainName) {
            return db.Registries
                .Where(x => x.Domain == domainName)
                .ToDictionary(
                    x => x.Key
                  , x => x.Value
                );
        }

    }

}

请原谅我:这些问题只是增加了我的观点,认为LINQ太丑陋,以至于它应该被削减,应该教导它向后走。是的:“长手”版本更加冗长,但它也更加不言自明。我想我的观点是“LINQ很棒。对STEEEEEEP学习曲线感到羞耻”。

而且,是的,请...让我们回到Perl cgi-scripts。祝福我父亲,因为我无法理解......我爱上了一个平民。叹息。

干杯。基思。