Ho due domande relative a Linq to SQL. Si prega di vedere l'immagine qui sotto per vedere come appare il mio modello.Eager caricamento di Linq in entità SQL in una tabella autoreferenziale
Domanda 1
Sto cercando di capire come caricare il campo User.AddedByUser
sul mio User
classe/tavolo ansioso. Questo campo è generato dalla relazione nel campo User.AddedByUserId
. La tabella è auto-referenziale e sto cercando di capire come ottenere Linq su SQL per caricare la proprietà User.AddedByUser
in modo avido, cioè ogni volta che qualsiasi entità User
viene caricata/recuperata, deve anche recuperare User.AddedByUser e User.ChangedByUser . Tuttavia, ho capito che questo potrebbe diventare un problema ricorsivo ...
Update 1.1:
Ho cercato di utilizzare i DataLoadOptions come segue:
var options = new DataLoadOptions();
options.LoadWith<User>(u => u.ChangedByUser);
options.LoadWith<User>(u => u.AddedByUser);
db = new ModelDataContext(connectionString);
db.LoadOptions = options;
ma questo non lavoro, ottengo la seguente eccezione sulla linea 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:
l'eccezione è abbastanza auto-esplicativo - l'oggetto grafico non è permesso essere ciclico. Inoltre, supponendo che la Linea 2 non abbia generato un'eccezione, sono abbastanza sicuro che la Linea 3 sarebbe, dal momento che sono chiavi duplicate.
Update 1.2:
La seguente non funziona neanche (non utilizzato in combinazione con Update 1.1 sopra):
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();
Esso genera la seguente, salvo auto-esplicativo:
System.NotSupportedException occurred
Message="Explicit construction of entity type 'i3t.KpCosting.Shared.Model.User' in query is not allowed."
Ora sono VERAMENTE in perdita su come risolvere questo. Per favore aiuto!
Domanda 2
Su ogni altra tavola nel mio DB, e quindi LINQ to modello SQL, ho due campi, Entity.ChangedByUser
(legato alla Entity.ChangedByUserId
chiave esterna/rapporto) e Entity.AddedByUser
(legato al Entity.AddedByUserId
chiave esterna/relazione)
Come faccio a ottenere da Linq SQL il carico di questi campi per me? Devo fare un semplice join sulle mie query? O c'è un altro modo?
Sì, desidero visualizzare tali informazioni nella GUI. Speravo di risolvere questo problema senza l'uso di tipi anonimi. Ma immagino che sia un modo per risolvere il problema. Il mio problema è legato all'impossibilità da parte di Linq di SQL di far fronte a molte e molte relazioni? –
Na, è possibile aggiungere i campi User.AddedDescription e User.ChangedDescription alla classe User e quindi non si dovrà utilizzare un tipo anon. Non ha davvero niente a che fare con la relazione molti-molti (ogni relazione nel tuo esempio è 1: 1). Se scriveste direttamente il vostro SQL, non vorreste ottenere tutte le proprietà di AddedByUser (incluso il suo AddedByUser e così via in infinito). Probabilmente ti basta prendere il suo nome e/o qualsiasi altro dettaglio che ti serva per la tua visione. Imo è un problema O/RM più generale. Penso che avresti lo stesso problema con L2E o Hibernate. –