2009-10-29 6 views
2

이 좋아 지금이내가 LINQ에서이 작업을 수행하려면 어떻게

public IEnumerable<roomvu_User> GetLocationUsers(
    long LocationID, 
    DateTime StartDate, 
    DateTime EndDate, 
    int StartRows, 
    int MaximumRows) 
{ 
    using (DataClasses_RoomViewDataContext context = Context) 
    { 
     IEnumerable<roomvu_LocationMapping> Mappings = 
      (from m in context.roomvu_LocationMappings 
       where (m.LocationID == LocationID 
       && (StartDate <= m.EndDate && m.StartDate <= EndDate)) 
       select m).Skip(StartRows).Take(MaximumRows); 

     List<roomvu_User> Users = new List<roomvu_User>(); 

     foreach (roomvu_LocationMapping Mapping in Mappings) 
     { 
      roomvu_User User = (from u in context.roomvu_Users 
           where (u.ID == Mapping.UserID) 
           select u).Single(); 
      Users.Add(User); 
     } 

     return Users; 
    } 
} 

을하지만 ..... 하나의 LINQ 표현에서이 작업을 수행 할 수있는 방법이 있어야합니다, foreach는 비트를 싫어

답변

1
from m in context.roomvu_LocationMappings 
join u in context.roomvu_Users 
on m.UserID equals u.ID 
where (m.LocationID == LocationID 
      && (StartDate <= m.EndDate && m.StartDate <= EndDate)) 
select new { Mapping = m, User = u } 

이 두 가지 속성, .Mapping.Usera의 순서를 반환합니다 도움이됩니다.

0
return 
    Mappings.ConvertAll<roomvu_User>(new Converter<roomvu_LocationMapping, roomvu_User>(a => 
    { 
     return (from u in context.roomvu_Users where (u.ID == Mapping.UserID) select u).Single(); 
    })); 

위, 처음

편집 작동하는지 확인 두 번째에 대한 확인 List<roomvu_LocationMapping> Mappings
또는

return (from m in Mappings 
     let u = context.roomvu_Users.Single(u => u.ID == m.UserID) 
     select u).ToList(); 

하지

100 %에 ConvertAll의 LINQ 확장을 사용하고 있습니다 : 당신의 편집의 COS를 !

나는 UR DB 구조를 잘 모릅니다 만 romvu_Users이 외부 키와 관련이 있는지 당신은 단지))

에 .Skip (StartRows) .Take (MaximumRows를

선택 m.roomvu_Users을 선택을 변경 할 수 있어야한다; 귀하의 Linq2Sql 쿼리

1

에서

나는 이것이 당신이 요구하는지 표현하는 가장 표현 방법입니다 생각합니다.

public IEnumerable<roomvu_User> GetLocationUsers(
    long LocationID, 
    DateTime StartDate, 
    DateTime EndDate, 
    int StartRows, 
    int MaximumRows) 
{ 
    using (DataClasses_RoomViewDataContext context = Context) 
    { 
     IQueryable<roomvu_LocationMapping> Mappings = 
      (from m in context.roomvu_LocationMappings 
       where (m.LocationID == LocationID 
       && (StartDate <= m.EndDate && m.StartDate <= EndDate)) 
       select m).Skip(StartRows).Take(MaximumRows); 

     IQueryable<roomvu_User> Users = 
       from Mapping in Mappings 
       join User in context.roomvu_Users 
       on Mapping.UserID equals User.ID into j 
       select j.Single(); 

     return Users.ToList(); // Force execution 
    } 
} 
: SQL에 LINQ는 GroupJoin()의 결과에 Single() 전화 (컴파일러가 join ... into j 변환하는 방법) 번역 똑똑 그러나, 나는 확실하지 않다
관련 문제