Bon, alors maintenant que je l'ai pris à bord qu'il ya une relation plusieurs à plusieurs, je pense Canavar est à droite - vous voulez un SelectMany
.
Encore une fois, c'est plus facile de voir dans une expression de requête:
var tableARows = from rowB in Context.TableB.Include("TableA")
where rowB.TableBID == 1
from rowA in rowB.TableA
orderby rowA.ColumnToSort
select rowA;
La raison pour laquelle il ne fonctionne pas est que vous avez un autre type de résultat. Auparavant, vous obtenez un type comme:
List<EntitySet<TableA>>
(je ne sais pas exactement le type que je ne suis pas un gars LINQ à entités, mais ce serait quelque chose comme ça.)
maintenant nous avons aplani toutes les lignes de tableA dans une liste unique:
List<TableA>
maintenant, vous ne pouvez pas commander une séquence de ensembles par une seule colonne dans une rangée - mais vous pouvez commander une séquence de lignes par une colonne. Donc, fondamentalement, votre intuition dans la question était juste lorsque vous avez dit «probablement parce que c'est une collection d'objets TableA, pas une seule rangée» - mais ce que vous entendez par «ça» n'était pas très clair.
Maintenant, cet aplatissement est-il réellement approprié pour vous? Cela signifie que vous ne savez plus quel B a contribué à un R particulier. Y a-t-il seulement un B impliqué ici, alors cela n'a pas d'importance?Si oui, il y a une autre option qui peut même effectuer mieux (je ne sais vraiment pas, mais vous pourriez vous regarder le SQL généré dans chaque cas et le profil il):
var tableARows = Context.TableB.Include("TableA")
.Where(b => b.TableBID == 1)
.Single()
.TableA.OrderBy(a => a.ColumnToSort)
.ToList();
Notez que cela échouer (ou au moins dans LINQ aux objets, je ne sais pas exactement ce qui se passera dans les entités) s'il n'est pas une ligne dans la table B avec un ID de 1. Fondamentalement, il sélectionne la seule rangée, puis sélectionne Tous associés à cette ligne, et les commande.
Super, ça a marché. Alors puis-je demander exactement quelle est la différence et pourquoi cela a fonctionné? –
@ Tom345: donnez-lui un upvote ou au moins accepter sa réponse – Hao