2016-11-06 5 views
0

Ich habe eine Liste von Objekten in der Tabelle TblB, die aus DB im folgenden Format abgerufen wird.links nicht equi join linq

public class playdata 
    { 
     public string consumerid { get; set; } 
     public string play_time { get; set; } 
     public string genre{ get; set; } 
     . 
     . 
     . 
     public int mycounter{ get; set; } 
    } 

Ich habe eine Tabelle TBLA, die eine Spalte colA hat die int von 0 bis 1000 hat

Ich möchte eine Linq-Abfrage ähnlich wie SQL als unten erstellen ..

Select x.i as numindex, y.consumerid,y.play_time,y.genre 
From 
(Select colA as i from tblA) x 
left join 
(
Select consumerid, play_time,genre,mycounter from tblB 
)y on y.mycounter > x.i 
erfolglos

ich habe versucht, nach dem ..

kam ich zu finden, dass Enumerable.Range (0, 1001) eine numerische Reihe erzeugt, so müssen keine tha bekommen t Tabellendaten ..

List<playdata> plays = ..... 



var q= (from s in Enumerable.Range(0, 1001) 
      join p in plays on s < p.mycounter into t 
      from rt in t.DefaultIfEmpty() select new{ 
    numindex=s, 
    consumerid=p.consumerid, 
    play_time =p.play_time, 
    genre=p.genre 
    }).ToList(); 

Ich sehe zwei Fehler in der zweiten Linie ..

p ist in ihrem Umfang nicht von der linken Seite von Gleichen .. Ich habe auch tried..p.mycounter> s mit dem gleichen Ergebnis.

Der andere Fehler ist in in dem es zeigt .. erwartete kontextuellen Stichwort gleich

Die Fehler gehen weg, wenn ich die zweite Zeile ändern ..

join p in plays on s equals p.mycounter into t 

Alle Hilfe herzlich willkommen ist.

Dank

Antwort

0

Sie haben die alternative Art und Weise zu verwenden, linke äußere darzustellen kommen in LINQ:

var q = 
    (from i in Enumerable.Range(0, 1001) 
    from p in plays.Where(x => x.mycounter > i).DefaultIfEmpty() 
    select new 
    { 
     numindex = i, 
     consumerid = p?.consumerid, 
     play_time = p?.play_time, 
     genre = p?.genre 
    }).ToList(); 

Beachten Sie, dass in LINQ to Objects Sie für die rechte Seite des linken äußeren Rechnung zu tragen haben join Rückkehr null Wenn kein übereinstimmendes Element vorhanden ist, erhalten Sie andernfalls NullReferenceException.

+0

wow .. ohne Join und auf Direktive..also .. könntest du zeigen, wo ich mehr über den p .genre Stil der Handhabung lesen kann null, Tx – Arnab

+0

Es ist der C# 6 [null Bedingungsoperator] (https : //msdn.microsoft.com/en-us/library/dn986595.aspx). –

+0

aha .. das ist vs2015, im Falle von vs2103 .. das 'p == null? String.Empty: p.genre) 'sollte funktionieren? Wenn der Parameter int oder long ist, muss ich String.Empty mit null ändern, muss das auch meine Klasse 'playdata' ändern, so wie int int wird? Was würde passieren, wenn es lang ist – Arnab