2014-12-10 2 views
1

나는 조직을위한 웹 사이트에서 일하고 있는데, 이것은 비영리 단체이며 무료입니다. 그래서 나는 나를 위해 일하는 사람을 찾고 있습니다. 단지 약간의 도움이됩니다. 그것은 나에게 비교적 새로운으로 뭔가 내가 ASPNET 엔티티 물건을 사용many to many relationship에 대한 Linq 쿼리

데이터베이스

그래서 내가 쿼리하고 테이블이

- AspNetRoles 
- AspNetUserRoles 
- AspNetUsers 

내가도의 테이블이 있습니다 매우 까다로운 발견하고 내 자신

- myEvents (Id, Title, PrivateEvent) 
- myEventsInRoles (EventId, RoleId) 
    - EventId is FK to myEvents(Id) and RoleId is FK to AspNetRoles(Id) 

이제 내 ADO 엔터티 모델을 만들었을 때 MyEventsInRoles (AspNetUserRoles와 같은)에는 AspNetUserRoles와 같은 외래 키인 두 개의 열만 있기 때문에 엔티티를 생성하지 않습니다. 그래서 그 두 테이블은 linq로 쿼리 할 수 ​​없습니다.

그래서 내 시나리오에서이

사용자가 로그인하고 이벤트 목록을 볼 수 싶어한다. 예

- AspNetUsers 
    - Id=1 
- AspNetUserRoles 
    - UserId=1, RoleId=1 
- AspNetRoles 
    - Id=1, Name=Red Team 
    - Id=2, Name=Blue Team 
    - Id=3, Name=Green Team 
- myEvents 
    - Id=1, Title=Big event, PrivateEvent=0 
    - Id=2, Title=Red And Green Team event, PrivateEvent=1 
    - Id=3, Title=Blue Team event, PrivateEvent=1 
- myEventsInRoles 
    - EventId=2, RoleId=1 
    - EventId=2, RoleId=3 
    - EventId=3, RoleId=2 

될 수 있도록 그래서 우리의 사용자가 레드 팀

에 생각한 그들은 다음과 같은 규칙에 해당해야하기 때문에 이벤트 1, 2해야 볼 수 그들을 위해 선택한 이벤트

  1. PrivateEvent 플래그가 false로 설정된 모든 이벤트
  2. 모두 PrivateEvent 플래그가 true로 설정된 이벤트 및 이벤트 ID가 myEventsInRoles에 있고 사용자의 역할 ID가 동일합니다. myEventsInRoles

에서 해당 레코드와 관련된 그래서 나는이 조금 더 복잡하지만, 생각 빅 이벤트와 레드 팀 이벤트

을 보여야하는데 나는 또한 운동을 할 수없는 다른 비슷하지 쿼리, 이는 단순히 사용자에 대한 모든 역할 ID 및 역할 이름을 가져 오는 것입니다.

+0

누군가가 이것을 도울 수 있다면, 단지 답을 찾는 것이 아니라 누군가가 어떻게 작동 하는지를 설명 할 수 있다면 :) –

+0

아마도 이것이 도움이 될 것입니다 : http://stackoverflow.com/questions/27067791/ef-fluent-api- 다 대다 - 다 -이 - id 필드 이름/27113924 # 27113924 – alexo

답변

0

그래서 영감의 플래시 후에 나는 실제로 내 두 가지 문제를 해결하기 위해 관리, 사용자에 대한 얻을 역할은 내가

var ctx = new ApplicationDbContext(); 
var user = HttpContext.Current.User; 
var userId = user.Identity.GetUserId(); 
    var roles = 
     ctx.Roles.Where(a => a.Users.Select(b => b.UserId).ToList().Contains(userId)) 
     .ToList(); 

그리고 내 이벤트의 문제를 생각보다 쉽게 ​​밝혀졌다

var events = 
       db.myEvents.Where(
       e => 
       e.date >= DateTime.Now 
       && (([email protected]) 
        || ([email protected] 
         && e.AspNetRoles.Where(a => a.AspNetUsers.Select(b => b.Id) 
          .ToList() 
          .Contains(userId)) 
          .Select(c => c.myEvents.Select(d => d.Id) 
          .ToList() 
          .Contains(e.Id)) 
          .Any()))) 
       .Select(
        e => 
        new EventItem 
        { 
         id = e.Id, 
         date = e.date, 
         description = e.description, 
         privateE = [email protected], 
         title = e.title, 
         type = e.type, 
         url = e.url 
        }); 

public class EventItem 
{ 
    public int id { get; set; } 
    public DateTime? date { get; set; } 
    public string description { get; set; } 
    public string title { get; set; } 
    public string type { get; set; } 
    public string url { get; set; } 
    public bool privateE { get; set; } 
}