0

LINQに問題があり、mabyの誰かが回答を得ました

string[] roleNames = Roles.GetRolesForUser(currentUserName);


result = context.MenuRoles.Select(mr => new MenuGenerateViewModel
{
    MenuID = mr.MenuID,
    MenuNazwa = mr.Menu.MenuNazwa,
    MenuKolejnosc = mr.Menu.MenuKolejnosc,
    MenuStyl = mr.Menu.MenuStyl,
    MenuParentID = mr.Menu.MenuParentID,
    MenuActive = mr.Menu.MenuActive,
    MenuActionName = mr.Menu.MenuAction.MenuActionName,
    MenuControlName = mr.Menu.MenuControl.MenuControlName,
    RoleName = mr.Role.RoleName,
    RoleID = mr.RoleID,
    MenuID = mr.MenuID
})
.Where(mr => mr.MenuActive == true)
.ToList();

string [] roleNamesのみを比較し、一致した場合にのみ返す方法。問題は常に、ユーザーが2つ以上の役割を担っている場合です。

回答のTx

4

3 に答える 3

2

あなたが何を求めているのか理解できたら、2 つ目の条件をWhere条項に追加してください。

        .Where(mr => mr.MenuActive && roleNames.Contains(mr.Role.RoleName))
于 2012-06-28T14:06:58.970 に答える
1

必要のないデータベースレコードから取得しないという単純な理由で、Where句を切り替える方がよいでしょう。Select

result = context.MenuRoles.Where(mr => mr.MenuActive 
                    && roleNames.Contains(mr.Role.RoleName))
                .Select(mr => ... )
                .ToList();

これにより、ロット全体を選択してからフィルタリングするのではなく、必要なレコードのみを選択する sql が生成されます。それを試して、違いを確認するために SQL プロファイラーを見てください (EF を使用する場合に役立つスキルです)。

于 2012-06-28T14:15:02.430 に答える
0

ここの優秀な人々の助けを借りて、目標を達成しました。

string[] roleNames = Roles.GetRolesForUser(currentUserName);


result = context.MenuRoles
    .Where(mr => mr.Menu.MenuActive && roleNames.Contains(mr.Role.RoleName))
    .Select(mr => new MenuGenerateViewModel
    {
        MenuID = mr.MenuID,
        MenuNazwa = mr.Menu.MenuNazwa,
        MenuKolejnosc = mr.Menu.MenuKolejnosc,
        MenuStyl = mr.Menu.MenuStyl,
        MenuParentID = mr.Menu.MenuParentID,
        MenuActive = mr.Menu.MenuActive,
        MenuActionName = mr.Menu.MenuAction.MenuActionName,
        MenuControlName = mr.Menu.MenuControl.MenuControlName,
        RoleName = mr.Role.RoleName
    })
    .ToList();

var userresult = context.MenuUsers
    .Where(mr => mr.Menu.MenuActive && mr.User.Username == currentUserName)
    .Select(mr => new MenuGenerateViewModel
    {
        MenuID = mr.MenuID,
        MenuNazwa = mr.Menu.MenuNazwa,
        MenuKolejnosc = mr.Menu.MenuKolejnosc,
        MenuStyl = mr.Menu.MenuStyl,
        MenuParentID = mr.Menu.MenuParentID,
        MenuActive = mr.Menu.MenuActive,
        MenuActionName = mr.Menu.MenuAction.MenuActionName,
        MenuControlName = mr.Menu.MenuControl.MenuControlName,
        Username = mr.User.Username
    })
    .ToList();

ここでは、グループ メンバーシップを介して、またはメニュー自体に直接割り当てられた、権限を持っているすべてのメニューを取得します。

// Kick all duplicates
var noduplicates = result.Concat(userresult)
                          .Distinct(new RoleMenuGenerateComparer());

通常、メニューに重複したくないため、それらを削除します。これが適切に機能するためには、IEqualityComparer を実装する必要があります (U はこれについて少し読むことができます)

public class RoleMenuGenerateComparer : IEqualityComparer<MenuGenerateViewModel>
{

    public bool Equals(MenuGenerateViewModel x, MenuGenerateViewModel y)
    {
        //Check whether the compared objects reference the same data.
        if (Object.ReferenceEquals(x, y)) return true;

        //Check whether any of the compared objects is null.
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        //Check whether the products' properties are equal.
        return x.MenuNazwa == y.MenuNazwa && x.MenuID == y.MenuID;
    }

    public int GetHashCode(MenuGenerateViewModel menuGenerateViewModel)
    {
        if (Object.ReferenceEquals(menuGenerateViewModel, null)) return 0;

        int hashMenuName = menuGenerateViewModel.MenuNazwa == null ? 0 : menuGenerateViewModel.MenuNazwa.GetHashCode();

        int hashMenuID = menuGenerateViewModel.MenuID == null ? 0 : menuGenerateViewModel.MenuID.GetHashCode();

        return hashMenuName ^ hashMenuID;

    }

}

もちろん、このコードを最適化できると信じていますが、今のところ、このようなものがあります。

助けを求めてすべて送信してください。

于 2012-06-29T10:12:30.703 に答える