2010-10-29 6 views
1

J'ai une structure simple de table dans SQL Server:Création d'une propriété interrogeable pour une LINQ à l'entité sql

Une table stockant une liste de vélo (vélo) et une deuxième table stockant une liste historique des propriétaires du vélo (Les propriétaires). En utilisant Linq 2 SQL, j'ai généré un modèle qui me donne une entité 'Bike' avec une relation de 1 à plusieurs 'Owner' appelée 'HistoricalOwners'.

So far so good ...

Maintenant, j'ai beaucoup de questions où je suis intéressé par le propriétaire actuel. Le propriétaire actuel étant l'entrée la plus récente dans la table des propriétaires.

repo.Bikes().Where(b => b.HistoricalOwners.OrderByDescending(o => o.Date).First().Name == "Joe") 

Cela fonctionne, mais c'est un peu moche, et ne dit pas vraiment ce que je demande. Ce serait bien de créer une propriété 'CurrentOwner' sur mon entité Bike et d'interroger celle-ci.

public Owner CurrentOwner 
{ 
    get 
    { 
     return HistoricalOwners.OrderByDescending(o => o.Date).First(); 
    } 
}  

Je pourrais interroger comme ceci:

repo.Bikes().Where(b => b.CurrentOwner.Name == "Joe") 

Cette compile, mais cources lors de l'exécution il échouera avec:

Le membre 'CurrentOwner' n'a pas de traduction pris en charge à SQL.

Ce qui est totalement logique.

Est-ce que quelqu'un sait comment je pourrais être capable de créer un CurrentOwner d'une manière qui laisserait cette requête fonctionner?

J'ai fait des recherches en obtenant CurrentOwner pour retourner un arbre d'expression au lieu d'une instance, mais je n'ai jamais eu d'endroit où j'étais vraiment content.

Ensuite, je me suis demandé si je pouvais ajouter une relation supplémentaire à mon référentiel linq 2 sql pour CurrentOwner et le contraindre à être un à un. Mais je ne semble pas être en mesure de le faire avec linq 2 sql. Je pense que je peux le faire avec les entités Linq 2, mais ce n'est pas une option pour le moment.

Quelqu'un a-t-il eu des idées sur comment je pourrais faire ce travail?

Merci à l'avance,

RMK

Répondre

0

Avez-vous essayé:

public Owner CurrentOwner 
{ 
    get 
    { 
     return HistoricalOwners.OrderByDescending(o => o.Date).FirstOrDefault(); 
    } 
} 

pour voir si cela se traduit par SQL?

+0

Cela ne va pas fonctionner, c'est pas différent de First() il ne sait toujours pas comment transformer CurrentOwner en SQL parce que CurrentOwner est une propriété et en tant que tel ne peut pas être traduit en une expression – RMK

+0

Avez-vous essayé -il comme une méthode à la place? –

+0

Ça ne marcherait pas non plus – RMK

0

Je ne pense pas que vous puissiez vraiment faire cela comme vous le voulez.

Ma suggestion:

Créer une nouvelle colonne de base de données, CurrentOwnerID, sur la table Bike, qui est une FK à OwnerID sur la table Owner. Mappez cela comme une association dans votre modèle, puis vous pouvez interroger CurrentOwner comme vous le souhaitez.L'inconvénient est que vous devez gérer la valeur de CurrentOwner comme pour toute autre propriété mappée - vous ne pouvez pas la dériver en utilisant une autre requête comme dans votre exemple original, donc cela peut ne pas convenir à votre application.

Cependant, c'est la façon dont j'ai résolu ce genre de problème dans le passé, et cela donne plus de flexibilité à votre modèle - vous pouvez choisir le propriétaire actuel, plutôt que de compter sur un résultat dérivé. comprendre.

+0

J'avais pensé à ça, mais j'espérais vraiment que ça n'allait pas être la réponse. Je suis réticent à introduire le surcoût de la gestion de la propriété supplémentaire + les changements externes à la base de données devraient également mettre à jour cette nouvelle relation. – RMK

+0

Je suis avec toi RMK. Il doit y avoir un moyen de faire cela avec le modèle existant. Tout ce que vous faites est de demander à L2S de faire la relation que @Sam suggère d'ajouter manuellement, mais dans une requête. Sûrement L2S peut à ce droit? –

Questions connexes