2016-11-06 93 views
0

我有一個表tblB中的對象列表,它以下面的格式從db中檢索。left non 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; } 
    } 

我有一個表TBLA具有其具有從0到1000

我希望創建類似於SQL如下LINQ查詢INT列可樂..

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 

我試過以下失敗..

我來找到Enumerable.Range(0,1001)生成一個數字序列,所以不需要得到臨時噸表數據..

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(); 

我看到在第二行的兩個錯誤..

p不是在等號的左邊的範圍。我有也tried..p.mycounter> s的相同結果。

其他錯誤是在爲它顯示..預計上下文關鍵字等於

的錯誤消失,如果我改變第二行..

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

所有幫助表示衷心感謝。

感謝

回答

0

你必須使用較左外的另一種方式加入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(); 

注意在LINQ到對象,你必須考慮到左外右側聯接返回null當沒有匹配的元素時,否則您將獲得NullReferenceException

+0

哇..沒有任何加入和指令..也可以顯示在哪裏我可以閱讀更多的p?.genre處理空的風格,null – Arnab

+0

它是C#6 [null條件運算符](https ://msdn.microsoft.com/en-us/library/dn986595.aspx)。 –

+0

aha ..那是vs2015,如果是vs2103 ..這個'p == null? String.Empty:p.genre)'應該工作?如果參數是int或long,我將不得不改變String.Empty爲null,這將需要我的類'playdata'來改變以及如int成爲int ?,如果長的話會發生什麼 – Arnab