2009-06-26 8 views
0

Le SQL généré fait une jointure croisée, mais comme les ID sont appariés, il agit comme une jointure interne, mais y a-t-il une meilleure façon de le faire en utilisant le mot-clé join en C#? Est-il possible où vous ne devez pas spécifier comment les propriétés se joindre car ils sont tous heirarchicly liés de toute façonMa syntaxe IQueryable est-elle correcte?

article est une classe Page

PageRoles est une propriété IQueryable dans une classe Page

aspnet_Roles est une propriété IQueryable dans une classe PageRole

var item = _repository.GetByKey(999); 

var f = (from fd in item.PageRoles 
     from k in fd.aspnet_Roles 
     where Roles.GetRolesForUser().Contains(k.RoleName) 
     && k.RoleId == fd.RoleId 
     select k.RoleName) 
     .Count(); 

EDIT:

Voici un exemple de propriété IQueryable dans mes classes. L'exemple ci-dessous provient de la classe PageRole

public IQueryable<aspnet_Role> aspnet_Roles 
{ 
    get 
    { 

      var repo=NorthCadburyWebsite.Models.aspnet_Role.GetRepo(); 
      return from items in repo.GetAll() 
       where items.RoleId == _RoleId 
       select items; 
    } 
} 

Répondre

0

Je n'ai pas mon IntelliSense avec moi, mais je pense que vous pouvez:

var f = (from fd in item.PageRoles 
     join k in fd.aspnet_Roles on k.RoleId equals fd.RoleId 
     where Roles.GetRolesForUser().Contains(k.RoleName) 
     select k.RoleName) 
     .Count(); 
+0

Changez le == à égal, et vous devrez échange donc fd.RoleId est sur la gauche et k.RoleId est sur la droite, mais oui je crois que c'est correct. J'essaie toujours de comprendre le but de la jointure et de la hiérarchie ... –

+0

vous ne pouvez pas faire de k dans fd.aspnet_Roles parce que pour une raison quelconque, il ne reconnaît pas fd ...? – Jon

+0

Je pense que j'avais raison la première fois ... Le K.RoleID va d'abord avant les égaux. Peut-être, mais –

0

Est-ce que la compilation ou obtenez-vous une erreur?

Dans ce cas, comme vous l'avez mentionné, vous n'avez pas besoin d'une jointure. Je ne l'ai pas utilisé cette syntaxe, mais il semble que vous utilisez k comme refererence (comme un alias dans la syntaxe SQL)

Cela devrait offrir le même résultat (sans même utiliser k):

var f = (from fd in item.PageRoles 
     where Roles.GetRolesForUser().Contains(fd.aspnet_Roles.RoleName) 
     && fd.aspnet_Roles.RoleId == fd.RoleId 
     select fd.aspnet_Roles.RoleName) 
     .Count(); 

Note: Non testé, juste une supposition.

+0

Impossible de faire fd.aspnet_Roles.RoleName comme fd.aspnet_Roles est IQueryable et non une instance de la classe – Jon

-1

Je pense que je suis confus, parce que je vois la hiérarchie suivante dans votre requête qui ne fait aucun sens:

 
[PageRoles] 
|--RoleId <~~~~~~~~~. 
|--[aspnet_Roles] | 
    |--RoleId ~~~~~~~* 
    |--RoleName 

La hiérarchie déterminée par le RoleId et vous ne signifie pour PageRoles.RoleId à la référence aspnet_Roles.RoleId? Donc, vous pourriez avoir quelque chose comme:

 
[PageRoles] [aspnet_Roles] 
|--RoleId |--RoleId 
      |--RoleName

Et vous essayez de faire dans les éléments suivants:

 
[PageRoles] 
|--RoleId 
|--[aspnet_Roles] (where RoleId == PageRoles.RoleId) 
    |--RoleName 

...?


Dans ce cas, si vous ne pouvez pas faire ce qui suit, puis quelque chose ne va pas avec vos définitions de propriétés IQueryable et non la requête que vous avez posté. À savoir, la méthode pour obtenir les lignes enfant aspnet_Roles n'est pas correctement configurée.

var f = (from fd in item.PageRoles 
     from k in fd.aspnet_Roles 
     where Roles.GetRolesForUser().Contains(k.RoleName) 
     select k.RoleName) 
     .Count(); 

(fd.aspnet_Roles devrait déjà être limitée par RoleId et générer une jointure interne).

Vous pouvez vérifier votre hiérarchie en voyant ce que SQL est généré à partir de:

var f = from fd in item.PageRoles 
     from k in fd.aspnet_Roles 
     select k; 

qui devrait ressembler vaguement (avec quelque chose ayant à voir avec un objet jeté):

SELECT k.RoleName, k.SomethingElse 
FROM PageRoles fd 
INNER JOIN aspnetRoles k ON fd.RoleId = k.RoleId; 

Je suis sûr qu'il me manque quelque chose, alors s'il vous plaît aidez-moi à remplir les blancs ...

+0

Quelqu'un veut-il expliquer leur downvote? –