这是我的MongoDB数据结构:
public class Part : ICloneable
{
string _id;
ObservableCollection<DataElement> PartData;
ObservableCollection<DataElement> SensorData;
}
public class DataElement: ICloneable
{
string description;
string[] values;
}
使用Linq我想阅读具有特定描述的SensorData,PartData和ResultData元素的所有部分$projected
/简化。
示例:
Part{
_id: id1,
PartData[
{description: "des1", values: "val1"},
{description: "des2", values: "val2"}
],
SensorData[
{description: "des3", values: "val5"},
{description: "des4", values: "val2"},
{description: "des5", values: "val2"}
]}
应该在具有描述&#34; des2&#34;,&#34; des4&#34;的所有元素上进行投射/减少。和&#34; des5&#34;,以便读取的数据看起来像
Part{
_id: id1,
PartData[
{description: "des2", values: "val2"}
],
SensorData[
{description: "des4", values: "val2"},
{description: "des5", values: "val2"}
]}
每个描述都是唯一的,但不是每个部分都包含所有描述。
在没有任何$ unwind / SelectMany的情况下,是否有一个简单的解决方案?像
这样的东西Select(p => p.PartData[] where p.PartData.Description == specifiedDescription),
p => p.SensorData[] where p.SensorData.Description == specifiedDescription))
但包括完整的数组元素,同时排除其他元素以及PartData和SensorData?
编辑: 在Veeram的回答之后,我试图实现以下内容:
parts = db.GetCollection<Part>("Part");
var pipeline = parts.Aggregate()
.Project(p => new
{ PartData = p.PartData.Where(d => d.Description == specifiedDescription),
SensorData = p.SensorData.Where(s => s.Description == specifiedDescription)
}) ;
var query = pipeline.ToEnumerable().AsQueryable();
var returnParts = new ObservableCollection<Part>(query);
但这会导致pipeline
成为匿名IAggregateFluent<'a>
而不是IAggregateFluent<Part>
,这会使query
成为匿名IQueryable<'a
&gt;因此导致编译错误&#34;无法转换为匿名IQueryable<'a
&gt;到IQueryable<Part>
&#34;插入query
作为ObservableCollection<Part>()
的构造函数的参数。
如果没有$select
,变量不再是匿名的,而是<Part>
类,并且编译错误不会发生。显然,$select
会更改聚合的类。
如何解决此错误?我的想法是让$project
不生成新类,而是重置当前类<Part>
的某些字段,但是如何实现呢?