2009-07-07 23 views
0

C'est par exempleConstruct objet de LINQ utilisant les mêmes champs d'une autre requête

SQL

create view v_join 
as select m.* , d.oneDetail from master m, detail d 
where m.key = d.key 

LINQ

var view = from v in dc.v_join select new 
{ 
    Master = ???? /// that is an issue, how can I construct the objects using same fields but from another query, 
    Detail = v.oneDetail 

}; 

foreach (var entry in view) 
{ 
    Master mEntry = entry.Master; // then we can use it, there are no problems 
} 

Cette situation rencontre assez souvent et est-il un moyen difficile à construire l'objet en utilisant les mêmes champs mais à partir d'une autre vue, et utilise. Quand je fais une telle jointure à C# -side, j'obtiens de faibles performances, des problèmes avec des charges paresseuses etc. Et de toute façon LINQ émet de nombreuses requêtes pour récupérer chaque enregistrement de détail, est inacceptible au point de vue performance.

Il doit y avoir une solution évidente, je ne peux pas croire que personne n'a fait face au même problème. Toutes les solutions évidentes comme dc.Translate font presque la même chose mais pas exactement ce dont j'ai besoin.

Aide appréciée.

Répondre

0

Est-ce que cela répond à vos besoins?

Master = new Master() { Field1 = v.Field1, Field2 = v.Field2, Field3 = v.Field3 } 
+0

Oui, exactement, mais je veux éviter de construire chaque champ manuellement – igor

+0

Je ne suis pas sûr de comprendre. Vous voulez une solution haute performance, mais vous ne voulez pas utiliser cette approche. L'avez-vous testé pour voir s'il est assez rapide? Si oui, alors pourquoi ne pas utiliser ce constructeur? –

1

de m dc.Master rejoindre d en dc.Detail sur M.Key = d.key sélectionnez Nouveau {m, d};

+0

J'ai essayé une telle approche, jugeant que le traitement ultérieur des résultats est extrêmement lent, je suppose que LINQ émet des requêtes distinctes pour aller chercher chaque enregistrement de détail – igor

+0

Ce n'est pas le cas. La requête ci-dessus entraînera un seul hit. Si vous rencontrez des problèmes de performance, veuillez fournir plus de détails (par exemple, schéma db, détails de table, etc.). – KristoferA

0

Pour moi, cela semble étrange. La raison pour laquelle vous utilisez la vue est d'avoir une "vue" différente sur le modèle, plutôt que d'accéder au modèle brut.

Je vous suggère de rester rejoindre la table maître-détail dans LINQ si vous en avez vraiment besoin, vous pouvez vous débarrasser du chargement paresseux en utilisant le loadWith Options. Bien que correctement ajusté, LINQ peut faire le chargement désireux qui résolvent le problème de performance.

0

Tu ne peux pas faire de v dans dc.v_join sélectionnez Nouveau { maître = new {Column1Name = v.masterColumn1, Column2Name = v.masterColumn2, ...}, Détail = v. oneDetail }; ?

+0

Approche évidente, mais je voudrais éviter la construction explicite. – igor