簡體   English   中英

帶有表達式主體的 lambda 表達式無法轉換為表達式樹 C# 實體框架

[英]A lambda expression with a expression body cannot be converted to an expression tree C# entity framework

我有一個具有以下模型的實體表

   public class VulnerabilityImportFileLog
    {
        public Collection<Vulnerability> Vulnerability { get; set; }
    }

嘗試使用實體框架查詢中的 select 語句返回字符串值

var vulnerabilityImportFileLogSelect = vulnerabilityImportFileLogQuery
        .Select(vulnerabilityImportFileLog =>
            new VulnerabilityImportedScansListViewDto
            {
                AssetName = vulnerabilityImportFileLog.Vulnerability.Select(y =>
                    {
                        if (y.AssetHostIPOrDomain.HostIPAssetId.HasValue)
                            return y.AssetHostIPOrDomain.HostIPAsset.Title;
                        else if (y.AssetHostIPOrDomain.DomainAssetId.HasValue)
                            return y.AssetHostIPOrDomain.DomainAsset.Title;
                        else
                            return y.AssetHostIPOrDomain.HostIPOrDomain;
                    }
                ).Distinct().ToList()
            });

其中AssetName的類型為List<string>並獲得異常為A lamda expression with a statement body cannot be converted to an expression tree

在此處輸入圖像描述

建議的答案是使用AsEnumerable() ,但即使這樣也不能解決問題。

您可以通過使用帶有“let”關鍵字的 linq 查詢語法來解決該問題:

AssetName = (from y in vulnerabilityImportFileLog.Vulnerability
    let resultString = y.AssetHostIPOrDomain.HostIPAssetId.HasValue
      ? y.AssetHostIPOrDomain.HostIPAsset.Title
      : y.AssetHostIPOrDomain.DomainAssetId.HasValue
      ? y.AssetHostIPOrDomain.DomainAsset.Title
      : y.AssetHostIPOrDomain.HostIPOrDomain
  select resultString
)
.ToList()
.Distinct();
    

假設脆弱性ImportFileLogQuery 是一個IQueryable<vulnerabilityImportFileLog>那么從關聯的漏洞關系中獲取詳細信息的典型方法是通過SelectMany 鑒於您需要根據可用的內容進行替換,一種選擇是進行雙重投影。 第一遍選擇並實現我們想要檢查的細節,然后第二遍組成結果。

vulnerabilityImportFileLogQuery.SelectMany(x => new 
{
    x.Vulnerability.AssetHostIpOrDomain.HostIpOrDomain,
    HostIpAssetTitle = x.Vulnerability.AssetHostIpOrDomain.HostIpAsset.Title,
    DomainAssetTitle = x.Vulnerability.AssetHostIpOrDomain.DomainAsset.Title
}).ToList()
.Select(x => x.HostIpAssetTitle ?? DomainAssetTitle ?? HostIpOrDomain)
.Distinct()
.ToList();

這實際上是從 HostIpAsset 和 DomainAsset 中獲取 3 個值、我們的默認 HostIpOrDomain 值以及 Titles(如果它們可用)。 如果實體未關聯或 Title 為 #null,則 EF 將返回 #null。 這個查詢是使用ToList實現的,然后我們根據空檢查選擇要使用的標題,然后再獲取我們的 Distinct 集。

希望這能給你一些想法作為起點。

暫無
暫無

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

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