【问题标题】:Distinct Select ListItem from IEnumerable从 IEnumerable 中选择不同的 ListItem
【发布时间】:2017-11-27 16:37:02
【问题描述】:

我有一个引用类型的对象列表,我将其传递给视图并在网格中显示。网格上方有许多用于过滤的下拉列表。我想使用基于网格数据的有效选项的不同列表填充dropdown 列表。我正在查看的是“创建者”。

public IEnumerable<SelectListItem> GetCreatedBy(IEnumerable<Quote> quotes)
{

    var x = quotes.GroupBy(q => new {
             ListValue = q.CreatedBy.samAccountName, 
             ListText = q.CreatedBy.DisplayName})
                .Select(group => new SelectListItem { 
                      Value = group.ListValue, 
                      Text = group.ListText });

        return x;
    }

我得到的错误是:

'IGrouping' 不包含 'ListValue' 的定义,并且没有 扩展方法“ListValue”接受类型的第一个参数 'IGrouping' 可以找到(您是否缺少 using 指令或 汇编参考?)

“报价”有一个“用户”对象作为“创建者”我想要一个 DropDownList 填充不同的用户 samAccountName 和 DisplayName,而无需重新查询以获取此列表。

我用.GroupBy() 尝试了.Distinct() 和上面代码的不同版本。

我是 MVC 的新手,对 lambda 表达式真的很陌生。任何帮助将不胜感激。

【问题讨论】:

  • 您需要指定要分组的列。 GroupBy 语法请参考this SO
  • 谢谢西瓦。我看到了那个例子,我认为它与我正在尝试做的不同。我试过 'var x = quotes.GroupBy(q => q.CreatedBy.samAccountName, q => q.CreatedBy.DisplayName, (key, g) => new SelectListItem { Value = key, Text = g.First()。 ToString() });'。这给了我所有用户的列表,但那里有重复。

标签: c# asp.net linq model-view-controller


【解决方案1】:

您可以使用 GroupBy 来获取不同的值,然后使用组中的第一个实例来获取您的值。

var x = quotes
    .GroupBy(q =>
        new 
        {
            q.CreatedBy.samAccountName,
            q.CreatedBy.DisplayName,
        })
    .Select(q => 
        new SelectListItem
        {
            Value = q.First().CreatedBy.samAccountName,
            Text = q.First().CreatedBy.DisplayName,
        });

【讨论】:

    猜你喜欢
    • 2010-11-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多