1

我有一个模型叫Roles

public string CodeRole { get; set; }
public string Organisation { get; set; }
public string LabelRole { get; set; }

CodeRoleLabelRole包含唯一值,但该Organisation列包含大约 12 个类别。我想生成一个允许用户过滤的下拉列表Organisation

因此,我想使用实体框架构造一个查询,该查询返回某种形式的列表/数组/集合,我可以轻松地将List<SelectListItem>两者转换为一个,text并且value等于不同的Organisation值。

我假设查询看起来像这样:

_context.Roles.GroupBy(r=> r.Organisation)

这会返回一个IGrouping<string,Roles>对象,但我不知道如何使用IGrouping.

这将允许我将List<SelectListItem>via a传递ViewBag给视图中的下拉列表。

编辑:基于 Alexander Manekovskiy 响应的最终解决方案

List<Roles> orgs = (List<DimRoles>)_context.Roles.GroupBy(f => f.Organisation).Select(r => r.FirstOrDefault()).ToList();
List<SelectListItem> items = new List<SelectListItem>();

foreach (DimRoles r in orgs) 
    items.Add(new SelectListItem { Text = r.Organisation, Value = r.Organisation });
4

1 回答 1

2

是的,关于 GroupBy,您是对的,但是您只需要从组中选择第一个值:

_context.Roles.GroupBy(r=> r.Organisation).Select(r = r.First())

另一种可能的解决方案是使用Distinct扩展方法:

_context.Roles.Select(r=> r.Organisation).Distinct()

然后让List<SelectListItem>你可以使用选择:

_context.Roles.GroupBy(r=> r.Organisation).Select(r => 
{ 
    var organization = r.First();
    return new SelectListItem() { Name = organization , Value = organization }
}).ToList();

但就个人而言,我更希望有另一种扩展方法来转换IEnumerable<T>List<SelectListItem>. 这可能是这样的:

public static IEnumerable<SelectListItem> GetList<TEntity>(this IEnumerable<TEntity> collection, Expression<Func<TEntity, object>> keyExpression,
    Expression<Func<TEntity, object>> valueExpression, object selectedValue = null)
{
    var keyField = keyExpression.PropertyName();
    var valueField = valueExpression.PropertyName();

    return new SelectList(collection, keyField, valueField, selectedValue).ToList();
}

然后你可以像这样使用它:

_context.Roles.Distinct(new OrganizationEqualityComparer()).GetList(o => o.Organization, o => o.Organization);

但在这种情况下,您将需要实现IEqualityComparer<Role>非常简单:

class RoleOrganizationComparer : IEqualityComparer<Role>
{
    public bool Equals(Role x, Role y)
    {
        if (Object.ReferenceEquals(x, y)) return true;
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        return x.Organization == y.Organization;
    }

    public int GetHashCode(Role role)
    {
        //Check whether the object is null 
        if (Object.ReferenceEquals(role, null)) return 0;

        //Get hash code for the Name field if it is not null. 
        return role.Organization == null ? 0 : role.Organization.GetHashCode();
    }
}
于 2013-04-23T15:24:26.103 回答