使用LINQ select键入推断失败

时间:2016-01-06 13:46:41

标签: c# html sql asp.net-mvc-4

我在MVC中有一个模板TimeSpan。

查看

@model TimeSpan?
@{
    var id = "id" + Guid.NewGuid().ToString().Substring(0, 5);
    string format = (string)(this.ViewData["format"] ?? @"hh\:mm\:ss");

    IEnumerable<SelectListItem> listValues;

    if (this.Model.HasValue)
    {
        listValues = from x in Enumerable.Range(0, 96)
                     .Select(x => new TimeSpan(9000000000 * x))
                     .Select(x => new SelectListItem {Selected = true, Value = x.ToString(), 
                                                       Text = x.ToString(format) })
    }
    else
    {
        listValues = from x in Enumerable.Range(0, 96)
                     select new SelectListItem { Value = x.ToString(), 
                                                 Text = x.ToString(format) };   
    }

}
<div class="field-small">
    @Html.DropDownListFor(x => x, listValues, new { id = id})
</div>
<script type="text/javascript"">
    $("#@id")
        .turnAutoComplete();
</script>

但有异常

  

select子句中表达式的类型不正确。类型   在“选择”调用中推理失败。

  

查询正文必须以select子句或group子句结尾

线路错误

listValues = from x in Enumerable.Range(0, 96)
                 .Select(x => new TimeSpan(9000000000 * x))
                 .Select(x => new SelectListItem { Selected = true, Value = x.ToString(),
                                                   Text = x.ToString(format) })

我不知道如何确定我的行

有什么问题

2 个答案:

答案 0 :(得分:2)

您正在尝试将查询表达式语法与常规方法调用混合使用,并且您最终得到的内容不是完整的查询表达式。你可以使用:

listValues = from x in Enumerable.Range(0, 96)
             let ts = new TimeSpan(9000000000 * x)
             select new SelectListItem {
                 Selected = true,
                 Value = ts.ToString(),
                 Text = ts.ToString(format)
             };

或者只是:

listValues = Enumerable.Range(0, 96)
                 .Select(x => new TimeSpan(9000000000 * x))
                 .Select(x => new SelectListItem {
                     Selected = true,
                     Value = x.ToString(),
                     Text = x.ToString(format)
                 });

答案 1 :(得分:0)

一旦开始使用&#34;来自&#34;的查询表达式语法,您还必须使用&#34;选择&#34;而不是.Select()。

您可以使用&#34; let&#34;

执行您想要的操作(计算TimeSpan一次,然后使用它两次)
  listValues = (from x in Enumerable.Range(0, 96)
                let ts = new TimeSpan(9000000000 * x)
                select new SelectListItem 
                { 
                    Selected = true, 
                    Value = ts.ToString(),
                    Text = ts.ToString(format)
                 });

);