2016-06-20 4 views
1

Пробовал изучать LinQJS с некоторого момента, преобразовывая некоторые старые Linq-запросы в LinqJs-query.Преобразование linq-запроса в linqjs

Это запрос Linq.

(from y in class1 
join x in class2 on y.Id equals x.Name 
group y by new { y.Date, x.Number } into xy 
select new class3() 
{ 
}).ToList(); 

Это моя текущая попытка (он был переписан много раз). Я думаю, что я просто не понимаю синтаксис.

var example = Enumerable.from(this.class1) 
    .join(
     this.class2, 
     "y => y.Id", 
     "x => x.Name", 
     " " 
    ) 
    .groupBy("x.Date", "y.Number") 
    .select(xy= new Class3(), { }) 
    .ToArray(); 

ответ

0

Ну, вы могли бы сделать что-то вроде этого

Во-первых, присоединиться к части.

var res = Enumerable.From(class1) 
     .Join(
       class2, 
       "x => x.Id", 
       "y => y.Name", 
       //I flattened all to make things more readable, you could also choose (x, y) => {c1:x, c2:y} for example 
       "(x, y) => {dte:x.Date, id:x.Id, name:y.Name, nb:y.Number, val:y.val} " 

       ).ToArray(); 

Тогда группа по частям (вы, конечно, можете делать все в одном)

 var res2 = Enumerable.From(res) 
    .GroupBy("p => {Date:p.dte, Number:p.nb}", 
      "p=> p", 
      //that's the "select" part, so put what you need in it 
      "(p, grouping) => {key: p, values: grouping.source}")     
    .ToArray(); 

Затем вы можете выбрать то, что вам нужно.

К сожалению, кажется (или я не понял, как это сделать) группа по нескольким полям не работает должным образом (она возвращает несколько записей).

Пока .GroupBy("p => p.dte}", работает должным образом.

0

Во-первых, важно понять, что запрос linq в синтаксисе запроса используется при преобразовании в синтаксис вызова метода.

(from y in class1 
join x in class2 on y.Id equals x.Name 
group y by new { y.Date, x.Number } into xy 
select new class3() 
{ 
}).ToList(); 

C# эквивалент:

class1.Join(class2, y => y.Id, x => x.Name, (y, x) => new { y, x }) 
    .GroupBy(z => new { z.y.Date, z.x.Number }) 
    .Select(xy => new class3()) 
    .ToList(); 

Тогда это должно быть просто преобразовать в эквивалентную Linq.js.

var query = 
    class1.Join(class2, "$.Id", "$.Name", "{ y: $, x: $$ }") 
     .GroupBy(
      "{ Date: $.y.Date, Number: $.x.Number }", 
      null, 
      null, 
      "$.Date + ' ' + $.Number" 
     ) 
     .Select("new class3()") 
     .ToArray(); 

Обратите внимание, что поскольку мы используем объект в качестве ключа, мы должны обеспечить сравнение селектора.