Linq.js 子查询
Linq.js sub query
我正在尝试使用 Linq.js 从数组中的 JSON 对象获取元素子集。
我有一组 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
的元素时,我可以 select 数组中基于其 属性 的元素,我将使用此查询
var queryResult2 = Enumerable.From(myArray)
.Where("$.layer == 'V_TRASA' && $.id>460800" )
.Select("$")
.ToArray();
但是我需要对数组属性 属性 做一些子查询,例如当 $.layer == 'V_TRASA'
并且元素包含属性 name =='DIMENZE' and invariantStringValue == 80
.
时我需要查询
我是 Linq 的新手,所以很难从我这里构建这个查询。
感谢您的帮助
您可以使用 Any 函数来确定一个序列是否包含任何元素。
这是一个例子:
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();
编辑
您可以将原型添加到 Enumerable,这样您就可以在 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();
我正在尝试使用 Linq.js 从数组中的 JSON 对象获取元素子集。
我有一组 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
的元素时,我可以 select 数组中基于其 属性 的元素,我将使用此查询
var queryResult2 = Enumerable.From(myArray)
.Where("$.layer == 'V_TRASA' && $.id>460800" )
.Select("$")
.ToArray();
但是我需要对数组属性 属性 做一些子查询,例如当 $.layer == 'V_TRASA'
并且元素包含属性 name =='DIMENZE' and invariantStringValue == 80
.
我是 Linq 的新手,所以很难从我这里构建这个查询。
感谢您的帮助
您可以使用 Any 函数来确定一个序列是否包含任何元素。
这是一个例子:
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();
编辑
您可以将原型添加到 Enumerable,这样您就可以在 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();