如何在C#查询中链接嵌套关系表中的数据



我有一个模拟设计时IList静态数据结构,它将存储在生产数据库中。该模型具有一对多关系(读数包含许多测量值(,但也具有多对一链接关系(测量值为MeasurementType(。我需要返回Reading的IEnumerable,每个条目都包含其测量值的列表,但每个测量值都需要MeasurementType对象来包含MeasurementTypes列表中的相关对象。

模型类中的Measurements和Type属性将不会保留在数据库中。

我可以看到如何将Readings列表返回到我的应用程序,其中Measurements list属性由测量列表中的匹配对象填充,但我正在努力寻找在每个测量中填充Type属性的最佳方法,以便使用基于id属性的measurementTypes列表中的相关对象进行读取,这样我也可以筛选出measurementType未设置为可见。

下面的查询失败,因为Type属性为null,我如何按Id加入measurementTypes列表中的Type对象,以便在查询中使用它??或者有比foreach循环中的查询更好的方法吗?

foreach (var reading in readings)
{
reading.Measurements = measurements.Where(m => (m.ReadingId == reading.Id) && (m.Type.Visible)).ToList();
}
return readings;

(为了清晰起见,对类别进行了简化(

public class Reading
{
public DateTime DateTime { get; set; }
public int Id { get; set; }
public IList<Measurement>? Measurements { get; set; }
}
public class Measurement
{
public int MeasurementTypeId { get; set; }
public int ReadingId { get; set; }
public MeasurementType? Type { get; set; }
public int Value { get; set; }
}  
public class MeasurementType
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public bool Visible { get; set; }
}
measurementTypes = new List<MeasurementType>()
{
new MeasurementType { Id = 1, Name = "A name", Visible = true }
...
};
measurements = new List<Measurement>()
{
new Measurement { ReadingId = 1, MeasurementTypeId = 1, Value = 100 }
...
};
readings = new List<Reading>()
{
new Reading { Id = 1, DateTime = DateTime.Today.AddDays(-366) }
...
};

Measurement和MeasurementType之间的关系必须手动构建。您需要将MeasurementType列表中的一个相关值分配给Type字段。你可以尝试的一种方法如下:

介绍测量中的构造函数

public class Measurement
{
// for mock tests
public Measurement(int measurementTypeId, int readingId, int value, IEnumerable<MeasurementType> measurementTypes)
{
MeasurementTypeId = measurementTypeId;
ReadingId = readingId;
Type = measurementTypes.Single(mt=>mt.Id==measurementTypeId),
Value = value;
}
public int MeasurementTypeId { get; set; }
public int ReadingId { get; set; }
public MeasurementType Type { get; set; }
public int Value { get; set; }
}

然后在构建测量列表时:

measurementTypes = new List<MeasurementType>()
{
new MeasurementType { Id = 1, Name = "A name", Visible = true }
...
};
measurements = new List<Measurement>()
{
new Measurement (1,  1,  100, measurementTypes) 
....
};

最新更新