2017-10-17 12 views
0

Je suis nouveau dans LINQ et Lambda et pour être honnête, je ne sais pas comment traduire ma requête d'une ligne à LINQ lambda.Peut-on me diriger dans la bonne direction ? thxRejoindre/ET - Traduire de SQL à Lambda LINQ C#

ceci est ma seule requête en ligne:

 SELECT *  
     FROM 
    dbo.[Sales Invoice Line] innerjoin 
      dbo.[Sales Comment Line] ON 
      dbo.[Sales Invoice Line].[Line No_] = dbo.[Sales Comment Line].[Document Line No_] AND 
      dbo.[Sales Invoice Line].[Document No_] = dbo.[Sales Comment Line].No_ 
+2

Ce n'est pas une requête sql valide –

+0

S'agit-il simplement de la partie JOIN? Vous devez poster toute la requête. – dpdragnev

+0

je sais. Je viens de couper le reste de, et j'ai juste besoin de cette ligne –

Répondre

0

Vous pouvez faire un champ à plusieurs rejoindre dans LINQ comme ceci:

var List1 = new List<Class1>(); 
List1.Add(new Class1 { Field1 = 1, Field2 = 2 }); 
List1.Add(new Class1 { Field1 = 3, Field2 = 4 }); 

var List2 = new List<Class2>(); 
List2.Add(new Class2 { Field1 = 1, Field2 = 2 }); 
List2.Add(new Class2 { Field1 = 5, Field2 = 6 }); 

var results = List1.Join(List2, 
         l1 => new {l1.Field1, l1.Field2}, 
         l2 => new {l2.Field1, l2.Field2}, 
         (l1, l2) => new {List1 = l1, List2 = l2}); 

La clé ici étant le 2 lambdas l1 => new {l1.Field1, l1.Field2} et l2 => new {l2.Field1, l2.Field2}. Ceux-ci créent des objets anonymes pour les lignes de chaque table qui contiennent les deux champs qui vous intéressent. La jointure ne réussit que lorsque les deux objets anonymes sont égaux.

Le 3ème lambda de là crée simplement l'objet qui est retourné comme valeur "jointe". Vous pouvez cependant créer n'importe quelle forme, celle-ci crée simplement un objet contenant les propriétés .Class1 et .Class2 contenant les lignes correspondantes de chaque liste. Vous pouvez l'aplanir si vous le souhaitez et/ou ajouter des propriétés supplémentaires dont vous avez besoin.

Tous les détails sur cette syntaxe sont disponibles sur la page de MSDN au joins using composite keys.

J'ai utilisé les 2 classes de figurante suivantes:

class Class1 
{ 
    public int Field1 { get; set; } 
    public int Field2 { get; set; } 
} 

class Class2 
{ 
    public int Field1 { get; set; } 
    public int Field2 { get; set; } 
} 

Un fichier LINQPad est disponible here.

+0

tnx pour tout cela. juste une question rapide, ceci mon Lambda: odvm.SalesCommentLine = data.Sales_Comment_Line.FirstOrDefault (d => d.No_ == odvm.SalesInvoiceLine.Document_No_); et il me donnera la colonne de commentaire et à mon avis im écrit par ex. @ Model.salecommentline.Comment, mais Commentaire Coulmn Contient une valeur nulle et beacuse de cela, je vais obtenir NullReference, mais je veux dire à mon code, peu importe sa colonne nulle ou non imprimée dat pour moi, comment puis-je faire dat?! –

+1

Essayez '@ Model.salecommentline? .Comment'. Cela nécessitera C# 6 cependant. Si vous utilisez une version plus ancienne, essayez '@ (Model.salescommentline! = Null? Model.salescommentline.Comment:" ")'. –

+0

dats wat je veux, merci beaucoup pour votre aide et votre temps –