2009-10-29 7 views
2

Ok j'ai maintenant ceComment puis-je faire dans 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; 
    } 
} 

Mais je déteste le peu foreach, il doit y avoir un moyen de le faire en une seule expression LINQ .....

Aide

Répondre

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 } 

retourne une séquence de a avec deux propriétés, .Mapping et .User.

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

Au-dessus utilise l'extension LINQ ConvertAll sur le List<roomvu_LocationMapping> Mappings
ou

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

pas à 100% sûr de la seconde, assurez-vous qu'il fonctionne premier

Edit: cos de votre édition !

je ne sais pas ur structure db mais si romvu_Users est lié avec les clés étrangères vous devriez juste être en mesure de changer la sélection à

sélectionnez m.roomvu_Users) .Skip (StartRows) .take (MaximumRows);

dans votre requête Linq2Sql

1

Je crois que c'est la façon la plus expressive pour représenter ce que vous demandez. Cependant, je ne suis pas sûr que LINQ to SQL est assez intelligent pour traduire l'appel Single() sur les résultats de l'GroupJoin() (comment le compilateur traduit 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 
    } 
}