문제

사용자의 역할이 포함 된 비트 마스크가있는 사용자 테이블이 있습니다. 아래 LINQ 쿼리는 역할에 1, 4 또는 16이 포함 된 모든 사용자를 반환합니다.

var users = from u in dc.Users
            where ((u.UserRolesBitmask & 1) == 1)
               || ((u.UserRolesBitmask & 4) == 4)
               || ((u.UserRolesBitmask & 16) == 16)
            select u;

이를 아래 메소드로 다시 작성하여 주어진 역할의 모든 사용자를 반환하여 재사용 할 수 있습니다.

private List<User> GetUsersFromRoles(uint[] UserRoles) {}

내 쿼리를 동적으로 빌드하는 방법에 대한 포인터가 있습니까? 감사

도움이 되었습니까?

해결책

당신은 사용할 수 있습니다 술어 빌더 수업.

PrecticateBuilder가 출시되었습니다 Linqkit Nuget 패키지

LINQKIT는 LINQ에서 SQL 및 엔티티 프레임 워크 파워 사용자를위한 무료 확장 세트입니다.

다른 팁

Userroles 값이 자체가 비트 마스크라고 가정하면이 작업이 작동합니까?

private List<User> GetUsersFromRoles(uint[] UserRoles) {
    uint roleMask = 0;
    for (var i = 0; i < UserRoles.Length;i++) roleMask= roleMask| UserRoles[i];
    // roleMasknow contains the OR'ed bitfields of the roles we're looking for

    return (from u in dc.Users where (u.UserRolesBitmask & roleMask) > 0) select u);
}

루프 대신에 작동하는 멋진 LINQ 구문이있을 수 있지만 개념은 동일해야합니다.

이것을 할 수있는 몇 가지 방법이 있습니다.

LINQ 동적 쿼리 라이브러리 :http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-linq-dynamic-query-library.aspx

발현 나무 및 라다 표현 :http://msdn.microsoft.com/en-us/library/bb882637.aspx

다음은 가변 수를 추가하는 한 가지 방법입니다. 어디 LINQ 쿼리에 조항. 비트 마스크 로직을 만지지 않았다는 점에 유의하십시오. 어디에스.

// C#
private List<User> GetUsersFromRoles(uint[] UserRoles)
{
   var users = dc.Users;

   foreach (uint role in UserRoles)
   {
      users = users.Where(u => (u.UserRolesBitmask & role) == role);
   }

   return users.ToList();
}

편집 : 사실, 이것은 그렇습니다 그리고 그만큼 어디 조항과 당신은 원했습니다 또는 그들을. 다음 접근 방식 (내부 조인)은 LINQ에서 객체에 작동하지만 LINQ에서 SQL로 SQL로 변환 할 수 없습니다.

var result = from user in Users
             from role in UserRoles
             where (user.UserRolesBitmask & role) == role
             select user;

어때? 역동적 인 LINQ는 아니지만 목표를 달성합니다.

private List<User> GetUsersFromRoles(uint[] userRoles) 
{
    List<User> users = new List<User>();

    foreach(uint userRole in UserRoles)
    {
        List<User> usersInRole = GetUsersFromRole(userRole);
        foreach(User user in usersInRole )
        {
            users.Add(user);
        }
    }
    return users;
}    

private List<User> GetUsersFromRole(uint userRole) 
{
    var users = from u in dc.Users
            where ((u.UserRolesBitmask & UserRole) == UserRole)
            select u;

    return users;    
}
private List<User> GetUsersFromRoles(uint UserRoles) {
  return from u in dc.Users            
         where (u.UserRolesBitmask & UserRoles) != 0
         select u;
}

그러나 Userroles 매개 변수는 배열 대신 비트 마스크로 제공되어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top