2011-09-13 2 views
1

원래 SQL 쿼리 : 긴장을 풀고/펼치기 엔티티 프레임 워크 결과

SELECT e.id, e.[type_id], e.name 
FROM [user] u 
JOIN user_group ug ON ug.[user_id] = u.id 
JOIN usergroup grp on grp.id = ug.group_id 
JOIN access_entity ae ON ae.group_id = grp.id 
JOIN entity e on e.id = ae.entity_id 
WHERE u.id = 184 
GROUP BY e.id, e.[type_id], e.name 

UNION 

SELECT e.id, e.[type_id], e.name 
FROM [user] u 
JOIN user_group ug ON ug.[user_id] = u.id 
JOIN usergroup grp on grp.id = ug.group_id 
JOIN CRUD xs on xs.FK_Group_ID = grp.id 
JOIN entity_type et on et.id = xs.FK_TypeID 
JOIN entity e on e.[type_id] = et.id 
WHERE u.id = 184 
AND e.confidential = 0 
AND xs.[Read] = 1 
GROUP BY e.id, e.[type_id], e.name 

는 LINQ to SQL은로 번역 :

var A = M.users 
    .Join(M.user_groups, u => u.id, ug => ug.user_id, (u, ug) => new { u = u, ug = ug }) 
    .Join(M.usergroups, x => x.ug.group_id, grp => grp.id, (x, grp) => new { u = x.u, ug = x.ug, grp = grp }) 
    .Join(M.access_entities, x => x.grp.id, ae => ae.group_id, (x, ae) => new { u = x.u, ug = x.ug, grp = x.grp, ae = ae }) 
    .Join(M.entities, x => x.ae.entity_id, e => e.id, (x, e) => new { u = x.u, ug = x.ug, grp = x.grp, ae = x.ae, e = e }) 
    .Where(x => x.u.id == Global.CurrentUser.id); 

var B = M.users 
    .Join(M.user_groups, u => u.id, ug => ug.user_id, (u, ug) => new { u = u, ug = ug }) 
    .Join(M.usergroups, x => x.ug.group_id, grp => grp.id, (x, grp) => new { u = x.u, ug = x.ug, grp = grp }) 
    .Join(M.CRUDs, x => x.grp.id, xs => xs.FK_Group_ID, (x, xs) => new { u = x.u, ug = x.ug, grp = x.grp, xs = xs }) 
    .Join(M.entity_types, x => x.xs.FK_TypeID, et => et.id, (x, et) => new { u = x.u, ug = x.ug, grp = x.grp, xs = x.xs, et = et }) 
    .Join(M.entities, x => x.et.id, e => e.type_id, (x, e) => new { u = x.u, ug = x.ug, grp = x.grp, xs = x.xs, e = e }) 
    .Where(x => x.u.id == Global.CurrentUser.id && x.xs.Read && x.e.confidential == 0); 

var RestrictedEntities = A.Select(x => x.e).Union(B.Select(x => x.e)); 

문제는 엔티티 프레임 워크 등 user_group 같은 테이블을 표시하지 않는다는 것입니다, 왜냐하면 그것은 단지 1 : * 연결 테이블이기 때문입니다. 엔티티 프레임 워크에서

, 나는 기본적으로 수행 할 수 있습니다

IQueryable<IEnumerable<IEnumerable<entity>>> Entities = this.ObjectContext.users.Select(u => u.usergroups.Select(ug => ug.access_entity.Select(ae => ae.entity))); 

그와 같은 단지

IQueryable<entity> 

을 반환해야하는 방법이 있나요?

+0

SelectMany (http://msdn.microsoft.com/en-us/library/bb534336.aspx) 후 무엇입니까? 나는 this.ObjectContext.users.SelectMany (u => u.usergroups.SelectMany (ug => ug.access_entity.Select (ae => ae.entity)))는 IEnumerable 타입이 이어야한다고 생각한다. – Rune

+2

고마워요, 그게 다예요 :) 대답으로 게시하면 받아 들일 것입니다. – NKCSS

+0

답변으로 게시 됨. 감사. – Rune

답변

3

SelectMany 무엇을하고 있습니까?

나는

this.ObjectContext.users.SelectMany(
    u => u.usergroups.SelectMany(
    ug => ug.access_entity.Select(ae => ae.entity))); 

유형 IEnumerable<entity>을해야한다 생각합니다.