2010-07-04 4 views
0

J'ai une fonction appelée GetUserByOpenIdJe ne veux pas être utiliser cette fonction toutConvertir sql avec Linq JOIN pour sélectionner IQueryable

Public Function GetUserByOpenID(ByVal claimedidentifier As String) As User Implements IUserRepository.GetUserByOpenID 
     Dim user = (From u In dc.Users 
        Join o In dc.OpenIDs On u.ID Equals o.UserID 
        Where o.ClaimedIdentifier = claimedidentifier 
        Select u).FirstOrDefault 
     Return user 
    End Function 

Ce que je veux vraiment être en mesure de faire est d'utiliser ma fonction "GetUsers" (IQueryable) et faire le JOIN dans ma couche de service.

Public Function GetUsers() As IQueryable(Of User) Implements IUserRepository.GetUsers 
     Dim users = (From u In dc.Users 
        Select u) 
     Return users.AsQueryable 
    End Function 

Quelqu'un peut-il me dire ce que la méthode ressembleraient pour renvoyer les données appropraite en utilisant une fonction similaire à ce

Public Function GetAllUsers() As System.Collections.Generic.IList(Of User) Implements IUserService.GetAllUsers 
     Return _UserRepository.GetUsers().Where(Function(u) (Not u.isClosed)).ToList 
    End Function 

Répondre

0

Hmm, il semble que vous devriez avoir une relation FK entre OpenIDs et les utilisateurs, mais tu ne le fais pas. Si vous créez cette relation, vous pourrez facilement la traverser via la propriété et ne pas avoir à faire d'interrogation du tout (en plus d'un simple Où).

+0

Il existe une relation entre OpenIds et les utilisateurs dans le concepteur DBML (et le serveur SQL). –

+0

alors vous devriez avoir une propriété OpenID sur votre objet utilisateur que vous pouvez facilement traverser. Dans la plupart des cas, vous n'avez pas besoin de jointures dans le code .NET car les relations entre les objets sont représentées sous la forme d'un graphe d'objet (références membres). – Stilgar

+0

Oui, cela fonctionne en utilisant l'objet OpenId, merci. –