簡體   English   中英

Linq to實體根據子項目選擇記錄

[英]Linq to entities select records based on subitems

我可以這樣表示我的實體模型:

-> Devices
  -> Records
    -> DataValues
      -> DataField
        - Name
      - Value

我想基於以下條件選擇“記錄”:

  • DataValue的DataField的名稱
  • DataValue的價值

一條記錄具有多個DataValues。 我想檢索所有評估為多組名稱和值值的記錄。

另外,我正在使用實體框架。 我一直在嘗試通過以下代碼實現這一目標:

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部分用盡了內存...

無論如何,你們中的任何一個都為我提供了有關如何實現自己想要的目標的提示?

假設您具有指向通過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);

上面的查詢直到將字符串轉換為雙精度的時候才將數據帶入內存,從而最大程度地減少了系統內存的負擔。 這與您的查詢不同,后者將特定設備的所有數據存入內存,並在其中進行過濾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM