Frage

Ich habe 2 im Zusammenhang Linq to SQL Fragen. Bitte beachten Sie das Bild unten, um zu sehen, was mein Modell aussieht.

Frage 1

Ich versuche, wie eifrig Liest das User.AddedByUser Feld auf meiner User Klasse / table Figur. Dieses Feld wird aus der Beziehung auf dem User.AddedByUserId Feld erzeugt. Die Tabelle ist selbst verweis, und ich versuche, herauszufinden, wie Linq to SQL erhalten gespannt auf die User.AddedByUser Eigenschaft zu laden, das heißt, wenn jede User Einheit / geholt geladen wird, muss auch die User.AddedByUser und User.ChangedByUser holen . Aber ich verstehe, dass dies ein rekursive Problem werden könnte ...

Update 1.1:

Ich habe versucht, die Dataload wie folgt zu verwenden:

var options = new DataLoadOptions();
options.LoadWith<User>(u => u.ChangedByUser);
options.LoadWith<User>(u => u.AddedByUser);

db = new ModelDataContext(connectionString);
db.LoadOptions = options;

Aber das funktioniert nicht, erhalte ich die folgende Ausnahme auf Zeile 2:

System.InvalidOperationException occurred
  Message="Cycles not allowed in LoadOptions LoadWith type graph."
  Source="System.Data.Linq"
  StackTrace:
       at System.Data.Linq.DataLoadOptions.ValidateTypeGraphAcyclic()
       at System.Data.Linq.DataLoadOptions.Preload(MemberInfo association)
       at System.Data.Linq.DataLoadOptions.LoadWith[T](Expression`1 expression)
       at i3t.KpCosting.Service.Library.Repositories.UserRepository..ctor(String connectionString) in C:\Development\KP Costing\Trunk\Code\i3t.KpCosting.Service.Library\Repositories\UserRepository.cs:line 15
  InnerException:

Die Ausnahme ist ziemlich selbsterklärend - das Objektgraph darf nicht zyklisch sein. Auch unter der Annahme, Linie 2 nicht eine Ausnahme aus, ich bin ziemlich sicher, dass die Linie 3 würde, da sie doppelte Schlüssel.

Update 1.2 :

Die folgende funktioniert auch nicht (nicht in Verbindung verwendet mit Update 1.1 oben):

var query = from u in db.Users
            select new User()
            {
                Id = u.Id,
                // other fields removed for brevityy
                AddedByUser = u.AddedByUser,
                ChangedByUser = u.ChangedByUser,

            };
return query.ToList();

Es führt die folgende, selbsterklärende Ausnahme:

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

Ich bin jetzt wirklich ratlos, wie diese zu lösen. Bitte helfen Sie!

Frage 2

Auf jedem anderen Tisch in meiner DB und damit Linq to SQL-Modell, ich habe zwei Felder, Entity.ChangedByUser (verknüpfte Fremdschlüssel Entity.ChangedByUserId / Beziehung) und Entity.AddedByUser (verknüpfte Fremdschlüssel / Beziehung Entity.AddedByUserId)

Wie bekomme ich Linq to eageryly diese Felder für mich zu laden, um SQL? Muss ich eine einfache verbinden auf meine Fragen tun ?, oder gibt es eine andere Möglichkeit?

Linq eifrig Laden auf SQL auf Selbstreferenzierung Tabelle http: //img245.imageshack. us / img245 / 5631 / linqtosql.jpg

War es hilfreich?

Lösung

Vielleicht versuchen Sie könnten einen Schritt zurück und sehen, was Sie wollen tun mit der Beziehung? Ich nehme an, Sie diese Information an den Benutzer in zum Beispiel angezeigt werden sollen "Geändert durch Iain Galloway Vor 8 Stunden".

Könnte so etwas wie die folgende Arbeit? : -

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
            };

Ich habe einen anonymen Typ gibt es für (imo) Klarheit verwendet. Sie könnten diese Eigenschaften zu Ihrem Usertyp hinzufügen, wenn Sie bevorzugen.

Was Ihre zweite Frage, Ihre normale Loadwith (x => x.AddedByUser) usw. sollte gut funktionieren - obwohl ich die Beschreibung String direkt in der Datenbank bevorzugen sind in der Regel zu speichern - Sie haben einen Kompromiss zwischen bekam Ihre Beschreibung Aktualisierung, wenn ChangedByUser.FullName Änderungen und mit etwas kompliziert und möglicherweise nicht eingängig zu tun, wenn die ChangedByUser (zB ON DELETE CASCADE, oder dem Umgang mit einem null-ChangedByUser in Ihrem Code) gelöscht werden.

Andere Tipps

Jede Art von Zyklen sind einfach nicht erlaubt . Da die LoadWith<T> oder AssociateWith<T> sind für jede Art auf die angelegte Kontext gibt es keine interne Möglichkeit, um eine Endlosschleife zu verhindern. Genauer gesagt, es ist nur verwirrt darüber, wie die SQL zu erstellen, da SQL Server nicht CONNECT BY und CTEs sind wirklich vorbei, was Linq können erzeugt automatisch mit dem mitgelieferten Framework.

Die beste Option für Sie ist manuell tun, um die 1-Pegel an der Benutzertabelle der Kinder für beide kommen nach unten und einem anonymen Typ zu ihnen zurückkehren. Leider ist es nicht eine saubere / einfache Lösung, aber es ist wirklich alles, was bisher mit Linq verfügbar ist.

Nicht sicher, dass es eine Lösung für dieses Problem mit LINQ to SQL ist. Wenn Sie SQL Server 2005 verwenden können Sie eine (rekursiv wie) Gespeicherte Procecdure definieren, die allgemeine Tabellenausdrücke verwendet das Ergebnis zu erhalten, die Sie wollen, und dann ausführen, dass die Verwendung DataContext.ExecuteQuery.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top