2011-06-29 2 views
0

J'ai cette requête qui exécute une jointure sur Books, TradingDesks et ProductInfos.Aide LINQ to SQL

var queryjoin = from b in books.values 
       join d in tradingdesks 
        on b.tradingdeskid equals d.id 
       **join p in productinfoss** 
        on b.id equals p.riskbookid 
       select new { p, book = b.name, tradingdeskname = d.name }; 

Dans la dernière jointure, Je voudrais faire une jointure externe droite avec les produits. J'essaie de ne pas utiliser la requête sql dynamique et d'essayer d'obtenir ce travail avec linq lui-même. Je ne veux pas utiliser où puisque cela affecte grandement les performances. J'ai essayé linq à des objets plus tôt mais ne pourrais pas obtenir la bonne exécution et essaye maintenant linq à sql mais ne peux toujours pas obtenir ceci. LINQ Query Help. Toute aide est grandement appréciée.

Répondre

1

Essayez cette (vérifier typo productinfos(s)):

EDIT: Désolé, je vous ai donné la jointure externe gauche. La jointure externe droite n'est pas disponible dans Linq, vous devez donc reformater légèrement la requête.

var queryjoin = from p in productinfos 
       join b in books.values 
        on p.riskbookid equals b.id into outer 
       from o in outer.DefaultIfEmpty() 
       join d in tradingdesks 
        on o.tradingdeskid equals d.id 
       select new { 
         p, 
         book = (o==null) ? "(no book name)" : o.name, 
         tradingdeskname = d.name 
         }; 
+0

N'est-ce pas l'équivalent de la jointure externe gauche? –

+0

Oui, désolé vous avez raison! Il doit être réorganisé en une jointure externe gauche (ou vous pouvez utiliser des groupes). Accrochez-vous ... –

1

s'il vous plaît essayer le

suivant
var queryjoin = from p in productinfoss 
       join b in books.values on p.riskbookid equals b.id into temp 
       from t in temp.DefaultIFEmpty() 
       join d in tradingdesks on 
       t.tradingdeskid equals d.id 
       new { p, book = t==null?"no name":t.name, tradingdeskname = d.name }; 

il devrait fonctionner dans ce scénario. Je ne l'ai pas testé si

+0

no. cela ne produit pas le résultat attendu. Dans ma requête initiale, j'obtiendrais tous les produits –

+0

c'est ce que vous obtiendrez en prenant la bonne jointure externe sur les produits. quoi d'autre vous voulez que cette requête vous renvoie –

+0

--- vôtre ----- SELECT DISTINCT [t0]. [Famille] DE [EVF_TradeService]. [dbo]. [Produit] AS [t0] GAUCHE OUTER JOIN [EVF_HierarchyService]. [Dbo]. [Livre] AS [t1] ON [t0]. [RiskBookId] = [t1]. [Id] INNER JOIN [EVF_HierarchyService]. [Dbo]. [TradingDesk] AS [t2] ON [t1]. [TradingDeskId] = [t2]. [Id] ---------------------------------- ---------------------------------- –