我有一个包含两列的设置表,“名称”和“值”:
Name | Value
-----------+-------
start_time | 9:30
end_time | 4:30
length | 30
我还有一个结果集,给出了每个时间段的约会数量:
count | time
------+--------
1 | 09:30
2 | 12:00
3 | 14:00
4 | 15:30
我需要显示start_time和end_time之间的所有时间段,其约会数量如下:
(1) 09:30
10:30
11:00
11:30
(2) 12:00
12:30
13:00
13:30
(3) 14:00
14:30
15:00
(4) 15:30
这是我得到的:
// data is the result of WebMatrix.Data.Database.Query
public void PrepareHTML(dynamic data)
{
StringBuilder SB = new StringBuilder("");
TimeSpan time = StartTime; // Start/EndTime are `TimeSpan`s defined in another place
// loop from StartTime to EndTime in 30 min increments
while(time <= EndTime)
{
String t = String.Format(@"{0:hh\:mm}", time);
try
{
var d = GetThisTime(t,data);
SB.AppendFormat("<option value=\"{0}\">({1}) {0}</option>", t, d["count"]); // error is here: Cannot apply indexing with [] to an expression of type 'object'
}
catch
{
SB.AppendFormat("<option value=\"{0}\">{0}</option>", t);
}
time = time.Add(Length);
}
H = SB.ToString();
}
public IEnumerable<dynamic> GetThisTime(String time, IEnumerable<dynamic> data)
{
return from a in data
where time.CompareTo(new TimeSpan(a.time)) == 0
select a;
}
更新: 我在评论中提出的“错误”并不明显,所以我将在这里复制:
我收到错误SB.AppendFormat("<option value=\"{0}\">({1}) {0}</option>", t, d["count"]);
错误是:
无法将带有[]的索引应用于“object”类型的表达式
由于似乎不清楚:我不想要IEnumerable的计数,我想要数据集的count列。见上面的第二个表格。
答案 0 :(得分:1)
现在GetThisTime
返回IEnumerable<dynamic>
,所以它集合,但你尝试像对象一样使用它。无论如何,您首先需要获取对象,例如使用First或FirstOrDefault,然后尝试获取属性值。
你可以稍微更改你的GetThisTime
proc,所以你不能使用结果,除了在一个地方你可以简单地返回你需要的数量
public dynamic GetThisTime(String time, IEnumerable<dynamic> data)
{
return (from a in data
where time.CompareTo(new TimeSpan(a.time)) == 0
select a["count"]).FirstOrDefault();
}
并像
一样使用它SB.AppendFormat("<option value=\"{0}\">({1}) {0}</option>", t, GetThisTime(t,data));
注意:您的表达式似乎错误:您尝试将字符串与TimeSpan进行比较
更新:我认为你需要改变你的逻辑,比如
public void PrepareHTML(dynamic data)
{
StringBuilder SB = new StringBuilder("");
TimeSpan time = StartTime; // Start/EndTime are `TimeSpan`s defined in another place
// loop from StartTime to EndTime in 30 min increments
while(time <= EndTime)
{
String t = String.Format(@"{0:hh\:mm}", time);
var d = GetThisTime(t,data); // Send the String instead of TimeSpan
if(d != null){
SB.AppendFormat("<option value=\"{0}\">({1}) {0}</option>", t, d); // error is here: Cannot apply indexing with [] to an expression of type 'object'
}
else
{
SB.AppendFormat("<option value=\"{0}\">{0}</option>", t);
}
time = time.Add(Length);
}
H = SB.ToString();
}
public object GetThisTime(String time, IEnumerable<dynamic> data)
{
return (from a in data
where time == a.time
select a["count"]).FirstOrDefault();
}