1

私はと呼ばれるモデルを持っていますRoles:

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

CodeRoleおよびLabelRole一意の値が含まれていますが、Organisation列には約 12 のカテゴリが含まれています。ユーザーが でフィルタリングできるドロップダウンを生成したいと考えていますOrganisation

その結果、エンティティ フレームワークを使用して、何らかの形式のリスト/配列/コレクションを返すクエリを作成したいと考えてList<SelectListItem>います。textvalueOrganisation

クエリは次のようになると思います。

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

これはオブジェクトを返しますが、のIGrouping<string,Roles>使用方法がわかりませんIGrouping

これにより、ビューのドロップダウン リストにList<SelectListItem>viaを渡すことができます。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 に答える