簡體   English   中英

無法翻譯 LINQ 表達式錯誤

[英]LINQ expression error could not be translated

我在嘗試執行查詢時遇到此錯誤。

System.InvalidOperationException: .Where(ti => (int)ti.Inner.OptionType == 1 && ti.Inner.QualifierId == null && ti.Inner.CreditingMethod != "xxx" && __ToList_0 .Any(e => e .Vdate== (Nullable)ti.Outer.ADate))' 無法翻譯。 以可翻譯的形式重寫查詢,或通過插入對 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的調用顯式切換到客戶端評估。 有關詳細信息,請參閱https://go.microsoft.com/fwlink/?linkid=2101038

我填充的對象是

public class OCList
    {
        public DateTime? Vdate{ get; set; }
        public Double? VWeight{ get; set; }
    }

/// example of adding to the list
List<OCList> ocList= new List<OCList>();
            if (request.Date1 != null && request.Weight1 != null)
            {
                ocList.Add(new OCList{ Vdate = request.Date1.Value, VWeight = request.Weight1.Value });
            }

錯誤在這里:

&& ocList.ToList().Any(e => e.Vdate == x.Tb2.ADate))

林克表達式:

var results = _context.Tb1
                .Join(_context.Tb2, oc => oc.OptionId, o => o.OptionId, (oc, o) => new { OptionCost = oc, Option = o })
                .Where(x => x.Tb2.Val1 == 1 
                    && x.Tb2.Val2 == null 
                    && ocList.ToList().Any(e => e.Vdate == x.Tb2.ADate))
                ////.........

在此處檢查客戶端和服務器端評估: https : //docs.microsoft.com/en-us/ef/core/querying/client-eval

EF Core 支持頂級投影中的部分客戶端評估(本質上是對 Select() 的最后一次調用)。 如果查詢中的頂級投影無法轉換到服務器,EF Core 將從服務器獲取任何所需數據並在客戶端評估查詢的其余部分。 如果 EF Core 在頂級投影以外的任何位置檢測到無法轉換到服務器的表達式,則會引發運行時異常。

您的ToListAny無法轉換為 sql,因此您會收到錯誤消息。

這會工作

var results = _context.Tb1
                .Join(_context.Tb2, oc => oc.OptionId, o => o.OptionId, (oc, o) => new { OptionCost = oc, Option = o })
                .AsEnumerable()
                .Where(x => x.Tb2.Val1 == 1 
                    && x.Tb2.Val2 == null 
                    && ocList.ToList().Any(e => e.Vdate == x.Tb2.ADate))

但它會首先從服務器獲取所有內容,然后應用where子句,從而導致性能不佳。

你可以像這樣讓它更好一點

var results = _context.Tb1
                .Join(_context.Tb2, oc => oc.OptionId, o => o.OptionId, (oc, o) => new { OptionCost = oc, Option = o })
                .Where(x => x.Tb2.Val1 == 1 
                    && x.Tb2.Val2 == null)
                .AsEnumerable()
                 .Where(ocList.ToList().Any(e => e.Vdate == x.Tb2.ADate))

暫無
暫無

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

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