0

私が取り組んでいる次のコードがあります。

var menuItems = _contentRepository.GetPk("01" + pk + "000")
    .OrderBy(m => m.Order)
    .Select(m => new Menu.Item
    {
        PartitionKey = m.PartitionKey,
        RowKey = m.RowKey,
        Order = m.Order,
        Title = m.Title,
        Type = m.Type,
        Link = m.Link,
        TextLength = m.TextLength
    });

.GetPk が返すフィールドの 1 つは、役割と呼ばれるフィールドです。これは、メニューの各項目にアクセスできるロールを示す内容を含む文字列フィールドです。フィールド内のデータは次のようになります。

All 
All,Admin 
All,Admin, Super
Admin
Admin, Super

ユーザーが持っているロールが入力された string[] ロールがあります。ユーザーが 1 つの役割を持っている場合、文字列配列には 1 つの項目があり、ユーザーが 2 つの役割を持っている場合は 2 つの項目があります。ユーザーに役割がない場合、配列は空です。

string[] ロールのエントリが Roles フィールドの単語の 1 つと一致する場合にのみ、select が値を返すようにするにはどうすればよいですか?

これまでのところ、いくつかの調査を行ってきましたが、必要なことをほぼ実行する次のものが見つかりました。しかし、これを上記のLinqにどのように適合させることができますか?

String[] roles = Roles.GetRolesForUser();
var links = from item in menus
    where item.Roles.Split(new String[] { "," }, StringSplitOptions.RemoveEmptyEntries)
    .Any(x => roles.Contains(x) || x == "All")
    select item;
4

1 に答える 1

0

結果を必要な形式に選択する前に、その条件をWhere句に含めるだけです。

var menuItems = _contentRepository.GetPk("01" + pk + "000")
.OrderBy(m => m.Order)
.Where(m => m.Roles.Split(",").Any(x => roles.Contains(x) || x == "All"))
.Select(m => new Menu.Item
{
    PartitionKey = m.PartitionKey,
    RowKey = m.RowKey,
    Order = m.Order,
    Title = m.Title,
    Type = m.Type,
    Link = m.Link,
    TextLength = m.TextLength
});
于 2013-01-23T17:33:05.747 に答える