【问题标题】:How to add Selectone row to a drop down list using linq如何使用 linq 将 Selectone 行添加到下拉列表
【发布时间】:2012-06-18 10:42:50
【问题描述】:

我有一个名为 States 的表,我正在使用 linq 查询在下拉列表中显示状态值 现在我想在 id 0 的第一个位置插入选择。 我正在使用以下查询来显示下拉列表:

var str = (from li in dbContext.states

               where li.state >= 1
               select new
               {

                   a=li.state

               }).ToArray();

上面的查询给出了我的 DB 中存在的所有值的意思。我如何首先插入选择一个? 请任何人提出任何方法或语法。 谢谢

【问题讨论】:

    标签: c# asp.net-mvc-3 linq


    【解决方案1】:

    查看 MajoB 的答案。

    虽然如果您使用的是@Html.DropDownListFor() Helper,您也可以使用 optionLabelArgument 指定 Id 0 行:

    public static MvcHtmlString DropDownListFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression,
        IEnumerable<SelectListItem> selectList,
        string optionLabel
    )
    

    更新:

    我认为 MajoB 的示例不起作用的原因是因为您在 Linq 查询中使用了匿名类型,但在 .Insert() 语句中定义了一个字符串。

    我相信不可能重用在.Insert() 语句中的 LINQ 查询中使用的相同匿名类型。

    所以你必须使用常规类型。

    (from x in 
        (from li in dContext.states
        where li.state >= 0
            select new {
                value = li.state,
                text = li.something
            }).AsEnumerable()
        select new SelectListeItem {
            Value = x.value.ToString()
            Text = x.text
        }).ToList().Insert(0, new SelectListItem() { .. });
    

    嵌套查询是必要的,因为.ToString() 无法转换为 sql。 .AsEnumerable() 调用创建了一个内存列表,.ToString 将在其中工作。

    我实际上在我们的代码库中使用了这样的扩展方法。 但它需要LinqKit 才能工作。

    public static IList<SelectListItem> ToSelectList<T>(this IQueryable<T> query
            , Expression<Func<T, long>> value
            , Expression<Func<T, string>> text
            , string nullText = null)
        {
            var result = (from x in
                              (from y in query.AsExpandable()
                               select new
                               {
                                   Value = value.Invoke(y),
                                   Text = text.Invoke(y),
                               }).AsEnumerable()
                          select new SelectListItem
                          {
                              Value = x.Value.ToString(),
                              Text = x.Text.ToString()
                          }).ToList();
    
            AddNullText(nullText, result);
            return result;
        }
    
    private static void AddNullText(string nullText, List<SelectListItem> result)
        {
            if (nullText != null)
            {
                result.Insert(0, new SelectListItem()
                {
                    Value = "",
                    Text = nullText,
                });
            }
        }
    

    (+与Expression&lt;Func&lt;T, string&gt;&gt;等相同的扩展方法,作为第二个参数。)

    【讨论】:

    • :我尝试了 MajoB 答案,但我错误地指出“方法有一些无效的参数”。我需要使用 linq 查询在 id 0 行中添加这个“选择一个”。还有其他可能的吗方式
    【解决方案2】:

    您必须在列表的开头添加一个额外的项目。

    var str = (from li in dbContext.states
    
                   where li.state >= 1
                   select new
                   {
    
                       a=li.state
    
                   }).ToList().Insert(0, "selectone");
    

    【讨论】:

    • :我使用了上面的方法,它说“有一些无效的参数”
    • 对不起...我在这里选择了两个值,一个是 li.state,它是字符串,另一个是 li.Id,它是整数。
    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多