2015-05-07 3 views
2

Я пытаюсь использовать Linq.js для получения подмножества элементов из объекта JSON в массиве.Linq.js sub query

У меня есть массив объектов JSON, что один из них выглядит так

{ 
"geometryType":2, 
"id":461219, 
"layer":"V_TRASA", 
"attributes": 
[ 
    { 
    "type":"String","name":"DIMENZE","invariantStringValue":"80" 
    }, 
    { 
    "type":"String","name":"DRUH","invariantStringValue":"nezadáno" 
    }, 
    { 
    "type":"String","name":"ETAPA","invariantStringValue":"nezadáno" 
    }, 
    { 
    "type":"Long","name":"ID","invariantStringValue":"461219" 
    }, 
    { 
    "type":"String","name":"JMTLAK","invariantStringValue":"nezadáno" 
    }, 
    { 
    "type":"String","name":"MATERIAL","invariantStringValue":"litina" 
    }, 
    { 
    "type":"String","name":"RC","invariantStringValue":"Vodovodní řad, geod.zaměření" 
    }, 
    { 
    "type":"String","name":"ULOZENI","invariantStringValue":"zem" 
    } 
], 
"mbr": 
{ 
    "xmin":-496466.545, 
    "ymin":-1155042.47, 
    "xmax":-496466.11, 
    "ymax":-1155042.145 
}, 
"lineSymbology": 
{ 
    "IRgbColor":-16776961, 
    "lineWeight":2 
}, 
"points": 
[ 
    {"x":-496466.545,"y":-1155042.145}, 
    {"x":-496466.11,"y":-1155042.47} 
] 
} 

каждый объект имеет массив атрибутов свойств. Я могу отдельные элементы из базы массива на его собственность, например, когда мне нужны элементы, которые layer = V_TRASA and ID >460000 я буду использовать этот запрос

var queryResult2 = Enumerable.From(myArray) 
     .Where("$.layer == 'V_TRASA' && $.id>460800")   
     .Select("$") 
     .ToArray(); 

Но мне нужно сделать некоторый подзапрос атрибутов собственности, которое массив, например, мне нужен запрос когда $.layer == 'V_TRASA' и элемент содержит атрибут name =='DIMENZE' and invariantStringValue == 80.

Я новичок в Linq, так что это сложно построить этот запрос из меня.

Спасибо за вашу помощь

ответ

3

Вы можете использовать Любой функцию, чтобы определить, содержит ли последовательность какие-либо элементы.

Вот пример:

var result = Enumerable.From(data) 
     .Where(function(i) { 
      var foundAttr = Enumerable.From(i.attributes).Any(
       function(j) { 
        return j.name == 'DIMENZE'; 
      }); 
      return i.layer == 'V_TRASA' && i.id >460800 && foundAttr; 
     }) 
     .Select("$") 
     .ToArray(); 

Редактировать

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

Enumerable.prototype.ContainsName = function(attrName){ 
    console.log(attrName); 
    return Enumerable.From(this).Any('i => i.name == "' + attrName + '"'); 
} 

var result = Enumerable.From(data) 
     .Where('i => i.layer == "V_TRASA" && i.id > 460800 && Enumerable.From(i.attributes).ContainsName("DIMENZE")') 
     .Select("$") 
     .ToArray(); 
+0

Привет Вано! Большое спасибо за ваш быстрый ответ !!! Это очень помогает мне. И покажи мне направление. Но есть ли возможность написать этот запрос без пользовательской функции? Что-то вроде этого? Я пытаюсь создать построитель запросов для пользователя. Что-то вроде: var queryResult2 = Enumerable.From (data) .Where ("$. Layer == 'V_TRASA' && Enumerable.From ($. Attributes) .Contains ($. Name == 'DIMENZE' && $. инвариантStringValue == '80') ") .Выберите (" $ ") .ToArray(); –

+0

Вы хотите расширить linq.js, добавив функции Contains? –

+0

Hi Vano no Я имею в виду переписать код на строчный лямбда-селектор. В одном предложении Where без пользовательской функции ... если это возможно. Чтобы объяснить свою проблему, у меня есть приложение C#, где пользователь имеет настраиваемый конструктор запросов, и пользователь может записать фрагмент кода SQL, чем я создаю inmemory sqlite Db и запустил этот SQL. В javascript этого не может быть. Так что я что-то ищу, но я не уверен, что пользовательская функция работает нормально. Есть ли способ переписать его в одно предложение where без пользовательской функции? –