是否可以使用Linq查询中的多个键填充HashTable?

时间:2011-08-02 22:30:41

标签: c# linq hashtable

我正在从SQL Server数据库中获取数据到DataTable中,我使用AsEnumerable进行转换,然后使用一系列Linq语句进行分离。我的最终目标是获取Linq查询并让它为我生成HashTable。所以不是匿名类型:

var facebookPosts
    = from f in results.AsEnumerable()
      where f.GetInt("SocialMediaTypeID").Equals(
          (int) SocialMediaRecordType.FacebookPost)
      select new {
          Headline = f.GetString("Headline"),
          Parameters = new Parameters(f.GetString("Parameters")),
          SocialMediaUserID = f.GetLong("SocialMediaUserID"),
          SocialMediaRecordID = f.GetLong("SocialMediaRecordID"),
          GravityScore = f.GetFloat("GravityScore"),
          NewsDate = f.GetDateTime("NewsDate", false),
          Template = "Facebook"
      };

我可以做这样的事情:

var facebookPosts1
    = from f in results.AsEnumerable()
      where f.GetInt("SocialMediaTypeID").Equals(
          (int) SocialMediaRecordType.FacebookPost)
      select new Hashtable {
          { "Headline", f.GetString("Headline"),
            "SocialMediaUserID", f.GetLong("SocialMediaUserID"),
             etc... }                                    
      };

.NET 4.0可以实现吗?

编辑:为了澄清这个问题,最终我正在做的是将JSON返回给浏览器。我的公司已经创建了一个派生自HashTable的JsonObject类,这是我必须用来最终返回Json的东西。我想要做的是在结果中每行创建一个Hashtable(或JsonObject),使用上面的例子,它具有一个名为 Headline 的键,其值为< em> f.GetString(“标题”),另一个名为 SocialMediaUserID 的键,其值为 f.GetLong(“SocialMediaUserID”),依此类推。 Facebookposts最终将是一个数组或IEnumerable的HashTable或JsonObject,每个都有几个键/值对。如果我不能这样做,我想我会把 facebookPosts 操纵到我需要的正确的JsonObject结构中吗?我确实需要明确指定名称。

2 个答案:

答案 0 :(得分:2)

我对Hashtable类知之甚少,因为Dictionary是.NET的标准哈希表实现。像这样的东西?

...
select new Dictionary<string, object>
                            {
                                {"Headline", f.GetString("Headline")},
                                {"SocialMediaUserID", f.GetLong("SocialMediaUserID")},
                                // etc..
                            };

或者,如果您碰巧有权访问System.Web

using System.Web.Routing;

facebookPosts1 = facebookPosts.Select(p => new RouteValueDictionary(p)).ToList();

答案 1 :(得分:0)

您尝试做的事情不适合.NET泛型,因为您尝试读取的字段并不总是相同类型。泛型的典型用法类似于Dictionary<string, string>,其中键和值的类型都是事先已知的。你还需要它嵌套更深层次;如果你让你的例子工作,它将返回一个IEnumerable<Hashtable>,这似乎不适合使用。

听起来你真正想要的是一个成熟的ORM,它将返回一个强类型类的集合。使用实体框架,它将处理为您创建集合,而无需执行您在此处尝试的操作。