Linq to实体根据子项选择记录
本文关键字:选择 记录 to 实体 Linq | 更新日期: 2023-09-27 18:27:15
我可以这样表示我的实体模型:
-> Devices
-> Records
-> DataValues
-> DataField
- Name
- Value
我想选择基于的记录
- DataValue的DataField的名称
- DataValue的值
一个记录有多个数据值。我想检索所有计算为多组Name和Value值的记录。
除此之外,我正在使用实体框架。我一直在尝试用以下代码来实现这一点:
Context.Devices.Where(q => q.SerialNumber == serialNumber)
.Single()
.DataRecords.Where(w => w.DataString.Prefix.ToLower() == "data")
.SelectMany(e => e.DataValues)
.Where(r =>
(r.DataField.Name == "" && r.Value == "") &&
(r.DataField.Name == "" && r.Value == ""))
.Where(t => t.DataField.Name == "")
.Select(y => Convert.ToDouble(y.Value));
糟糕的是,我已经用完了SelectMany部分的RAM。。。
不管怎样,你们中的任何人都为我提供了如何实现我想要的东西的建议?
假设您有通过EF公开的指向父级的链接,如果您在DataValues
级别运行查询并约束父级,则应该能够将更多的工作卸载到RDBMS上,如下所示:
var res = Context.DataValues
.Where(dv => dv.Record.DataString.Prefix.StartsWith("data")
&& dv.Record.Device.SerialNumber == serialNumber
&& (
dv.DataField.Name == "quick" && dv.Value == "brown"
|| dv.DataField.Name == "fox" && dv.Value == "dog"
))
.Select(dv => dv.Value)
.AsEnumerable() // <<== This will bring your data into memory
.Select(y => Convert.ToDouble(y);
上面的查询不会将数据带入内存,直到需要运行字符串到double的转换,从而最大限度地减少系统内存的压力。这与查询不同,查询会将特定设备的所有数据放入内存,并在内存中执行过滤。