2016-11-06 6 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, которая имеет столбец COLA, который имеет Int от 0 до 1000.

Я хотел бы создать Linq запрос, похожий на SQL, как показано ниже ..

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) сгенерировал числовую серию, поэтому нет необходимости получать tha т Таблица данных ..

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

Я вижу две ошибки во второй строке ..

р не входит в комплект левой части равных .. У меня также tried..p.mycounter> ы с таким же результат.

Другая ошибка в в котором он показывает .. как ожидаются контекстное ключевым слово равно

Ошибки уходит, если я меняю вторую строку ..

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

wow .. без какого-либо соединения и по директиве..также мог бы показать, где я могу больше узнать о стиле p? .genre обработки null, Tx – Arnab

+0

Это C# 6 [нулевой условный оператор] (https : //msdn.microsoft.com/en-us/library/dn986595.aspx). –

+0

aha .. это vs2015, в случае vs2103 .. это 'p == null? String.Empty: p.genre) 'должен работать? в случае, если параметр является int или long, мне нужно будет изменить String.Empty с нулевым значением, будет ли это требовать, чтобы my class 'playdata' также изменился, например int, становясь int ?, что произойдет в случае long – Arnab