2016-11-06 88 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