[英]A lambda expression with a statement body cannot be converted to an expression tree(Lambda and Linq)
[英]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.