Как мне сделать это в LINQ - PullRequest
       25

Как мне сделать это в LINQ

2 голосов
/ 29 октября 2009

Хорошо, теперь у меня есть это

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;
    }
}

Но я ненавижу бит foreach, должен быть способ сделать это в одном выражении LINQ .....

Помощь

Ответы [ 3 ]

1 голос
/ 31 октября 2009

Я считаю, что это самый выразительный способ представить то, что вы просите. Однако я не уверен, что LINQ to SQL достаточно умен, чтобы перевести вызов Single() на результаты GroupJoin() (как компилятор переводит join ... into j):

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
    }
}
1 голос
/ 29 октября 2009
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 }

Возвращает последовательность a с двумя свойствами, .Mapping и .User.

0 голосов
/ 29 октября 2009
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();
    }));

Выше используется расширение ConvertAll linq на List<roomvu_LocationMapping> Mappings
или

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

не уверен на 100% во втором, сначала убедитесь, что он работает

Редактировать: потому что вы редактируете!

Я не знаю, какая у вас структура БД, но если romvu_Users связан с внешними ключами, вы можете просто изменить выбор на

выберите m.roomvu_Users) .Skip (StartRows) .Take (MaximumRows);

в вашем запросе Linq2Sql

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...