将Linq查询返回为一个KeyValuePair列表

9

我正在将我的图表应用程序从预设数据转换为使用数据库。

以前我使用的是这个:

var data = new Dictionary<string, double>();            

switch (graphselected)
{        
case "1":
    data = new Dictionary<string, double>
    {
        {"Dave", 10.023f},
        {"James", 20.020f},
        {"Neil", 19.203f},
        {"Andrew", 4.039f},
        {"Steve", 5.343f}
    };
    break;
case "2":
    data = new Dictionary<string, double>
    {
        {"Dog", 10.023f},
        {"Cat", 20.020f},
        {"Owl", 19.203f},
        {"Rat", 16.039f},
        {"Bat", 27.343f}
    };
    break;
//etc...
}

// Add each item in data in a foreach loop
foreach (var item in list)
{
    // Adjust the Chart Series values used for X + Y
    seriesDetail.Points.AddXY(item.Key, item.Value);
} 

这就是我要做的事情:
var list = new List<KeyValuePair<string, double>>();

switch (graphselected)
{
case "1":
    var query = (from x in db2.cd_CleardownCore
                 where x.TimeTaken >= 10.0
                 select new { x.IMEI, x.TimeTaken }).ToList();
    list = query;                
    break;
//...
}

我的代码在以下位置出错:

list = query; 

带错误信息:

Cannot implicitly convert type 'System.Collections.Generic.List<AnonymousType#1>'
to 'System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string,double>>'

我该如何实现转化?


5
对你来说,new { x.IMEI, x.TimeTaken } 是否看起来像一个键值对? - Jeff Mercado
从另一篇帖子中得知:“LINQ需要一个无参数的构造函数,因为它想要使用集合初始化({}括号)。你可以有额外的类构造函数,但是LINQ不会使用它们。”据我理解,这就是为什么代码格式如此的原因。来源:http://stackoverflow.com/questions/15382840/only-parameterless-constructors-and-initializers-are-supported-in-linq-to-entiti - Baggerz
1个回答

26

如果您想要一个键值对列表,您需要使用键值对构建它!将匿名对象在选择语句中替换为以下内容:

select new KeyValuePair<string,double>(x.IMEI,x.TimeTaken)

为您的新问题进行了编辑:

var q = (from x in db2.cd_CleardownCore
             where x.TimeTaken >= 10.0
             select new { x.IMEI, x.TimeTaken });
var query = q.AsEnumerable() // anything past this is done outside of sql server
      .Select(item=>new KeyValuePair<string,double?>(item.IMEI,item.TimeTaken))
      .ToList();

1
你好Ronan,感谢您的帮助。我尝试使用上面的代码,但由于我的double是可空的,所以出现了以下错误:参数2:无法将“double?”转换为“double”我尝试将其更改为select new KeyValuePair<string,double>(x.IMEI,(double)x.TimeTaken)).ToList();但现在出现以下错误:仅支持LINQ到实体中的无参数构造函数和初始化器。 - Baggerz
如果您的值可以为空,那么强制转换它们就没有意义,只需使用我给您的代码,并将您的“list”变量类型更改为兼容的类型,例如 var list = new List<KeyValuePair<string, double?>>();。 - Ronan Thibaudau
谢谢Ronan,我尝试了上面的方法,但是它不喜欢在select new KeyValuePair<string,double>(x.IMEI,x.TimeTaken)中的double类型。 所以我将其更改为select new KeyValuePair<string,double?>(x.IMEI,x.TimeTaken) 然而,当代码运行时,我仍然得到相同的错误:LINQ to Entities只支持无参数构造函数和初始化器。 - Baggerz
1
它不喜欢的是新的KeyValuePair(无论你使用什么)因为它不是一个无参构造函数,你可以绕过Linq到实体并在客户端上执行此操作。我现在正在编辑我的帖子。 - Ronan Thibaudau
谢谢Ronan,代码很好用,你的解释也非常详细,所以我现在明白了。 :) 不过,我能否请你再次更新你的编辑,因为我注意到下面缺少了一个闭合括号。.Select(item=>new KeyValuePair<string,double?>(item.IMEI,item.TimeTaken)) - Baggerz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接