在为下拉列表控件构建selectList时参考ENUM描述

时间:2011-07-27 08:54:19

标签: asp.net-mvc linq

我有一个表单视图模型类,用于填充选择列表以供我的视图使用。以下是创建SelectList的部分的摘录。问题是它的查找表包含2个其他键

        var waterIndicatorValues = waterIndicator
            .OrderBy(u => u.WaterIndicatorDescription)
            .Select(u => new KeyValuePair<int, string>(u.WaterIndicatorId, u.WaterIndicatorDescription + " [" + u.UnitTypeId.ToString() + "] " + u.HazardTypeId.ToString()));
        this.WaterIndicatorList = new SelectList(waterIndicatorValues, "Key", "Value", water.WaterIndicatorId);

我想要与那些Id相关联的文本描述,而不是UnitTypeId和HazardTypeId。所以我希望我的代码看起来像这样:

        var waterIndicatorValues = waterIndicator
            .OrderBy(u => u.WaterIndicatorDescription)
            .Select(u => new KeyValuePair<int, string>(u.WaterIndicatorId, u.WaterIndicatorDescription + " [" + u.UnitTypeId.ToDescription() + "] " + u.HazardTypeId.ToDescription()));
        this.WaterIndicatorList = new SelectList(waterIndicatorValues, "Key", "Value", water.WaterIndicatorId);

此代码返回错误“Method'System.String ToDescription(System.Enum)'没有支持的SQL转换。”

任何评论/帮助非常感谢

UnitTypeId的ENUM:

using System.ComponentModel;

namespace Emas.Model.Enumerations
{
    /// <summary>
    /// Defines the Unit Types.
    /// </summary>
    public enum UnitType
    {
        [Description("- Please Select -")]
        Blank = 0,

        [Description("kWh")]
        kWh = 1,

        [Description("m3")]
        m3 = 2,

        [Description("litres")]
        litres = 3,

        [Description("Kg")]
        Kg = 4,

        [Description("Unit(s)")]
        Unit = 5,

    }
}

1 个答案:

答案 0 :(得分:1)

您无法在LINQ中使用从数据库中提取数据的扩展方法,因为它无法将此扩展代码转换为SQL。但是,您可以使用ToArray()ToList()来触发数据库命中,然后在结果中使用扩展方法代替内存。

更新

根据您在更新的代码中尝试实现的目标,我认为this article可能会得到您需要的答案。当然,你也需要转换为枚举类型。

更新2:

在使用扩展名进行选择之前,使用ToList()转换为内存应该可以正常工作:

    var waterIndicatorValues = waterIndicator
        .OrderBy(u => u.WaterIndicatorDescription)
        .ToList()
        .Select(u => new KeyValuePair<int, string>(u.WaterIndicatorId, u.WaterIndicatorDescription + " [" + u.UnitTypeId.ToDescription() + "] " + u.HazardTypeId.ToDescription()));
    this.WaterIndicatorList = new SelectList(waterIndicatorValues, "Key", "Value", water.WaterIndicatorId);