left non equi join linq

时间:2016-11-06 07:18:28

标签: c# linq

我有一个表tblB中的对象列表,它是以下列格式从db中检索的。

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,它有一个列colA,其int为0到1000。

我希望创建一个类似于sql的linq查询,如下所示..

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不在等于左侧的范围内。我也尝试过.p.mycounter&gt; s,结果相同。

另一个错误在于它显示的位置..预期的上下文关键字等于

如果我将第二行改为..

,错误就会消失
join p in plays on s equals p.mycounter into t

真诚感谢所有帮助。

由于

1 个答案:

答案 0 :(得分: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 to Objects中,当没有匹配元素时,您必须考虑左外连接的右侧返回null,否则您将获得NullReferenceException