2016-08-08 11 views
0

ich von C# diese LINQ Ausdruck bin attemping, aber es scheint nichtLinq von C# zu VB.net

C#

var v = (from a in dc.ChatPrivateMessageMasters 
        join b in dc.ChatPrivateMessageDetails on a.EmailID equals b.MasterEmailID into cc 
        from c in cc 
        where (c.MasterEmailID.Equals(fromid) && c.ChatToEmailID.Equals(toid)) || (c.MasterEmailID.Equals(toid) && c.ChatToEmailID.Equals(fromid)) 
        orderby c.ID descending 
        select new 
        { 
         UserName = a.UserName, 
         Message = c.Message, 
         ID = c.ID 
        }).Take(take).ToList(); 

VB

Dim v = (From a In dc.ChatPrivateMessageMasters _ 
Join b In dc.ChatPrivateMessageDetails On a.EmailID Equals b.MasterEmailID _ 
Into cc _ 
From c In cc Where (c.MasterEmailID.Equals(fromid) AndAlso c.ChatToEmailID.Equals(toid)) OrElse (c.MasterEmailID.Equals(toid) AndAlso c.ChatToEmailID.Equals(fromid)) _ 
Order By c.ID Descending _ 
Select New With { _ 
    .UserName = a.UserName, _ 
    .Message = c.Message, _ 
    .ID = c.ID _ 
}).Take(take).ToList() 

erhielt ich eine Arbeit Fehler von 'In' mit Nachricht: ')' erwartet

Irgendeine Idee?

// aktualisieren meine Datenbankstruktur enter image description here

enter image description here

+1

Haben Sie versucht, diesen [code Konverter] (http: //converter.telerik .com /)? –

+1

Ja, aber nicht nützlich – John

+1

Verstehen Sie, was die Absicht der ursprünglichen 'in'-Klausel versucht zu tun? In Visual Basic wird 'INTO' mit Aggregation verwendet und nicht nur eine vorherige Abfrage umbrechen. –

Antwort

0

Für den Anfang, Sie nicht die Gruppe benötigen beitreten (der into Teil Ihrer join Klausel), wenn man bedenkt Sie es glätten sofort (und don mache keinen linken äußeren Join zum Beispiel).

Ihre C# Abfrage kann einfach sein:

var query = 
    (from m in dc.ChatPrivateMessageMasters 
    join d in dc.ChatPrivateMessageDetails on m.EmailID equals d.MasterEmailID 
    where (d.MasterEmailID == fromid && d.ChatToEmailID == toid) 
     || (d.MasterEmailID == toid && d.ChatToEmailID == fromid) 
    orderby d.ID descending 
    select new 
    { 
     m.UserName, 
     d.Message, 
     d.ID 
    }).Take(take).ToList(); 

Und die VB.net Äquivalent davon ist:

Dim query = 
    (From m In dc.ChatPrivateMessageMasters 
    Join d In dc.ChatPrivateMessageDetails On m.EmailID Equals d.MasterEmailID 
    Where (d.MasterEmailID = fromid AndAlso d.ChatToEmailID = toid) 
    OrElse (d.MasterEmailID = toid AndAlso d.ChatToEmailID = fromid) 
    Order By d.ID Descending 
    Select m.UserName, d.Message, d.ID 
    Take take).ToList 
+0

Der Code kann weiter "vereinfacht" werden; "Take" -Klausel existiert in der Abfragesyntax für VB.Net und '(From ...). ToList' kann als' Aggregate ... IntoToList' umgeschrieben werden, wobei alle Klammern entfernt werden (auch diejenigen, die nicht benötigt werden) AndAlso hat Vorrang vor OrElse) – Sehnsucht

+0

Danke Jeff, ich werde versuchen – John

+0

@Sehnsucht: Danke für den Tipp über die anderen Klauseln. Insbesondere wusste ich nicht, dass "Take" verfügbar war. Ich war mir nicht sicher, wie ich "Aggregate" in diese integrieren sollte, so dass ich am Ende mit dem 'ToList'-Aufruf festhalte. Die zusätzlichen Parens auf der 'Where'-Klausel stimme ich zu, aber für einige Leute macht es es lesbarer und ich würde es nicht aus einer Übersetzung entfernen, wenn jemand anderes dachte, es wäre hilfreich. –