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。。。

不管怎样,你们中的任何人都为我提供了如何实现我想要的东西的建议?

Linq to实体根据子项选择记录

假设您有通过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的转换,从而最大限度地减少系统内存的压力。这与查询不同,查询会将特定设备的所有数据放入内存,并在内存中执行过滤。