7
votes

Chargement impatient de LINQ vers des entités SQL dans une table d'auto-référencement

J'ai 2 questions liées à Linq à SQL. S'il vous plaît voir l'image ci-dessous pour voir ce que mon modèle ressemble à ce que mon modèle ressemble.

question 1 strong> p>

J'essaie de comprendre comment charger le user.addedbyuser Code> champ sur mon utilisateur code> classe / table. Ce champ est généré à partir de la relation sur le champ code> user.addedbyuserid code>. La table est auto-référençant et j'essaie de comprendre comment obtenir Linq à SQL pour charger la propriété user.addedbyUser code> avec impatience, c'est-à-dire chaque fois que tout utilisateur utilisateur code> est Chargé / récupéré, il doit également récupérer l'utilisateur.addedbyUser et utilisateur.ChangedByUser. Cependant, je comprends que cela pourrait devenir un problème récursif ... p>

update 1.1: p>

J'ai essayé d'utiliser les dataloadoptions comme suit: xxx pré>

mais cela ne fonctionne pas, je reçois l'exception suivante sur la ligne 2: p> xxx pré>

L'exception est tout à fait -Explanatoire - Le graphique d'objet n'est pas autorisé à être cyclique. En outre, en supposant que la ligne 2 n'a pas lancé une exception, je suis à peu près sûr que la ligne 3 serait, puisqu'elles sont des touches en double. P>

mise à jour 1.2 p>: P> > Ce qui suit ne fonctionne pas non plus (non utilisé en conjonces avec update 1.1 em> ci-dessus): p> xxx pré>

Il jette l'exception auto-explicative : P>

System.NotSupportedException occurred
Message="Explicit construction of entity type 'i3t.KpCosting.Shared.Model.User' in query is not allowed."


0 commentaires

3 Réponses :


0
votes

Pas sûr qu'il y a une solution à ce problème avec LINQ à SQL. Si vous utilisez SQL Server 2005, vous pouvez définir une Procurreure (récursive similaire) stockée qui utilise des expressions de table communes pour obtenir le résultat que vous souhaitez, puis exécutez cela à l'aide de DataContext.executequery.


0 commentaires

3
votes

Peut-être que vous pourriez essayer de prendre un pas en arrière et de voir ce que vous voulez faire em> avec la relation? Je suppose que vous souhaitez afficher ces informations à l'utilisateur par ex. "Modifié par IAIN GALLOWAY il y a 8 heures".

Pourrait quelque chose comme le travail suivant? : - P>

var users = from u in db.Users
            select new
            {
              /* other stuff... */
              AddedTimestamp = u.AddedTimestamp,
              AddedDescription = u.AddedByUser.FullName,
              ChangedTimestamp = u.ChangedTimestamp,
              ChangedDescription = u.ChangedByUser.FullName
            };


2 commentaires

Oui, je veux afficher cette information dans mon interface graphique. J'espérais résoudre ce problème sans utiliser de types anonymes. Mais je suppose que c'est un moyen un moyen de résoudre le problème. Mon problème est-il lié à l'incapacité de Linq à SQL pour faire face à de nombreuses relations?


NA, vous pouvez ajouter des champs utilisateur.addeddescription et utilisateur.ChangedDescription à la classe d'utilisateur, puis vous n'auriez pas à utiliser un type anon. Ce n'est pas vraiment rien à voir avec les nombreuses relations (chaque relation dans votre exemple est 1: 1). Si vous écrivez directement votre SQL directement, vous ne voudriez pas avoir toutes les propriétés du LohatByUser (y compris son ajout à l'infini). Vous venez probablement de saisir son nom et / ou quels que soient les détails dont vous avez besoin pour votre vue. IMO c'est un problème o / rm plus général. Je pense que vous auriez le même problème avec L2E ou Hibernate.